diff --git a/components.py b/components.py index 5a2a773cd6d9368d8fb7f3dab7e5475812f5a494..c79011f5856c62b5efd5a4dde11717f249807729 100644 --- a/components.py +++ b/components.py @@ -1,8 +1,6 @@ from dataclasses import dataclass import pandas as pd import ERFormatConstants as const -from dynamics import * - class Threat: """_summary_ @@ -26,12 +24,11 @@ class Threat: def __str__(self) -> str: return f"Threat: {self.id}, {self.name}, {self.linkedIndicators}" - def findIndicatorsThreat(df:pd.DataFrame, diagram: component.Diagram, self): + def findIndicatorsThreat(self, df:pd.DataFrame, diagram): """ Links the indicators for the threat to the threat object and updates the metrics dictionary with the indicators """ - - componentId = self.componentID # Define the ID of the component + componentId = self.componentID # Define the ID of the componen lines = df.loc[df['Name']=='Line'] # Find all lines in the diagram lineSource = lines.loc[lines[const.From] == componentId] # Find the line where the component is the source @@ -42,36 +39,61 @@ class Threat: else: lineOne = lineDestination - if lineOne[const.From].item() == componentId: # If the component is the source - lineTwo = df.loc[df[const.Id] == lineOne[const.To].item()] # Find the component associated with the line - else: - lineTwo = df.loc[df[const.Id] == lineOne[const.From].item()] # Find the component associated with the line + # * LineOne is the line connecting the threat to the Attack, and the relationship line + # * First we find the attack component on the other end of theline + + + if lineOne[const.From].item() == componentId: # If the component is the source + # ? Since lineOne from is the threat component, lineOne to is the attack component + attackComponent = df.loc[df[const.Id] == lineOne[const.To].item()] # Find the component associated with the line + else: + attackComponent = df.loc[df[const.Id] == lineOne[const.From].item()] # Find the component associated with the line + + # * Now we need to find the lines associated with the relationship component + lineOneComponentID = lineOne[const.Id].item() - sourceComponent = df.loc[df[const.Id]==lineTwo[const.From].item()] # Defines the source of the line connecting threats/consequences and attacks - destinationComponent = df.loc[df[const.Id]==lineTwo[const.To].item()] # Defines the destination of the line connecting threats/consequences and attacks + lines = df.loc[df[const.To] == lineOneComponentID] + if lines.empty: + lines = df.loc[df[const.From] == lineOneComponentID] - - if componentType == const.ThreatDynamic: # * If the component is a threat - if sourceComponent[const.textArea1].item() == const.Threat: # Checks if source or destination is the threat - self.associatedThreat = sourceComponent - self.associatedAttack = destinationComponent - else: - self.associatedThreat = destinationComponent - self.associatedAttack = sourceComponent - - elif componentType == const.ConsequenceDynamic: # * If the component is a consequence - - if sourceComponent[const.textArea1].item() == const.Consequence: - self.associatedConsequence = sourceComponent - self.associatedAttack = destinationComponent + # * Due to the presence of barriers we need to iterate over the result and find the one that is the relationship component + for cols, rows in lines.iterrows(): + if rows[const.To] == lineOneComponentID: + potentialID = rows[const.From] else: - self.associatedConsequence = destinationComponent - self.associatedAttack = sourceComponent + potentialID = rows[const.To] + + potentialComponent = df.loc[df[const.Id] == potentialID] + if potentialComponent[const.typeField].item() == const.Threat: + relationshipComponent = potentialComponent + break + + # * We now have the relationship component, and the attack component + # * We can now extract the metrics from the relationship component and define the attack + + attackComponentID = attackComponent[const.Id].item() + attackType = attackComponent[const.AttackType].item() + attackDescription = attackComponent[const.AttackDescription].item() + + attack = Attack(attackComponentID, attackType, attackDescription) + diagram.attacks[attackComponentID] = attack + + + for i in range(4, len(relationshipComponent.columns), 2): + + indicatorID = relationshipComponent[f"Text Area {i}"].item() + if indicatorID == "" or "NaN": + break + + indicatorID = int(indicatorID) + + indicatorReason = relationshipComponent[f"Text Area {i+1}"].item() + self.linkedIndicators[indicatorID] = indicatorReason + diagram.indicators[indicatorID].threatAssoicates[self.id] = self - # ! After parsing the different components related to the dynamics component, - # ! the metrics in the component are added to the global metric list and local metric list - self.linkMetric(df, metricsDict) + return diagram + class Consequence: """_summary_ @@ -93,6 +115,56 @@ class Consequence: def __str__(self) -> str: return f"Consequence: {self.id}, {self.name}, {self.consequence}, {self.linkedIndicators}" + def findIndicatorsConsequence(self, df:pd.DataFrame, diagram): + """ + Links the indicators for the consequence to the consequence object and updates the metrics dictionary with the indicators + """ + componentId = self.componentID # Define the ID of the componen + lines = df.loc[df['Name']=='Line'] # Find all lines in the diagram + + lineSource = lines.loc[lines[const.From] == componentId] # Find the line where the component is the source + lineDestination = lines.loc[lines[const.To] == componentId] # ! The component SHOULD be source however, to error handle we need to check for destination as well + + if lineSource.isnull().values.any() == True: # Checks if the threat is the source or destination + lineOne = lineSource + else: + lineOne = lineDestination + + + # * Now we need to find the lines associated with the relationship component + lineOneComponentID = lineOne[const.Id].item() + + lines = df.loc[df[const.To] == lineOneComponentID] + if lines.empty: + lines = df.loc[df[const.From] == lineOneComponentID] + + # * Due to the presence of barriers we need to iterate over the result and find the one that is the relationship component + for cols, rows in lines.iterrows(): + if rows[const.To] == lineOneComponentID: + potentialID = rows[const.From] + else: + potentialID = rows[const.To] + + potentialComponent = df.loc[df[const.Id] == potentialID] + if potentialComponent[const.typeField].item() == const.Consequence: + relationshipComponent = potentialComponent + break + + + for i in range(4, len(relationshipComponent.columns), 2): + + indicatorID = relationshipComponent[f"Text Area {i}"].item() + if indicatorID == "" or "NaN": + break + + indicatorID = int(indicatorID) + + indicatorReason = relationshipComponent[f"Text Area {i+1}"].item() + self.linkedIndicators[indicatorID] = indicatorReason + diagram.indicators[indicatorID].consequenceAssociates[self.id] = self + + return diagram + class Attack: """_summary_ @@ -122,6 +194,42 @@ class ERComponent: self.linkedIndicators:dict[int, str] = {} +class Indicator: + """ + The metric class is associated with all the dynamics components AND the matrix + The initial creation of metrics is done through the dynamic units, there the init function is used to create the metrics, + and fill them with the correct associated components (erID, bowtieID) + When the object is then accessed again for the matrix parse the metrics are filled with the correct values + """ + def __init__(self, ID, name, value, date, frequency, guide, scale, interpretation) -> None: + """ + Metrics are created when parsing dynamics and are there filled with args + When the matrix is parsed the metrics are filled with the correct values + Args: + ID (str): Unique ID for the metric + name (str): Unique name for the metric + """ + #Metrics found in the dynamics tables + self.erAssociates: dict[int, ERComponent] = {} # ID of the metric used to locate in dynamics matrics + self.threatAssoicates: dict[int, Threat] = {} # ID of the metric used to locate in dynamics matrics + self.consequenceAssociates: dict[int, Consequence] = {} # ID of the metric used to locate in dynamics matrics + self.attackAssociates: dict[int, Attack] = {} # ID of the metric used to locate in dynamics matrics + + + self.indicatorID = ID # ID of the metric used to locate in dynamics matrics + self.indicatorName = name # Name of the metric + self.value = value # Value of the metric + self.date = date # Date of the metric + self.frequency = frequency # Frequency of the metric + self.measureGuide =guide # Measure guide of the metric + self.scale = scale # Scale of the metric + self.interpretation = interpretation # Interpretation of the metric + + + def __str__(self) -> str: + return f"Metric: {self.name}, Value: {self.value} Last update: {self.date}" + + @dataclass class Diagram(): # Dicttionaries of threats, consequences, attacks, indicators and ER components @@ -136,36 +244,4 @@ class Diagram(): self.consequences = {} self.attacks = {} self.dynamics = {} - self.metrics = {} - - def getThreat(self, id) -> Threat: - """_summary_ - - Args: - id (_type_): _description_ - - Returns: - Threat: _description_ - """ - - threat = self.threats[id] - return threat - - def getConsequence(self, id) -> Consequence: - """_summary_ - - Args: - id (_type_): _description_ - - Returns: - Consequence: _description_ - """ - consequence = self.consequences[id] - return consequence - - def getAttack(self, id) -> Attack: - attack = self.attacks[id] - return attack - - def getIndicator(self, indicaorID) -> ERDynamic: - pass \ No newline at end of file + self.indicators = {} \ No newline at end of file diff --git a/diagramParser.py b/diagramParser.py index 4253712dc65c2a265e4362fd210b6875151603ec..6dc19bd863deed45cbc511166cb90c67f2d36546 100644 --- a/diagramParser.py +++ b/diagramParser.py @@ -1,7 +1,6 @@ import pandas as pd import ERFormatConstants as const import components as component -import dynamics as dynamic import logging as log import matrices as matrix @@ -19,9 +18,9 @@ def parseDiagramFile(csvFile) -> component.Diagram: diagram = parseThreats(df, diagram) # diagram = parseConsequences(df, diagram) diagram = parseAttacks(df, diagram) - - + print("Diagram successfully parsed") + return diagram # Function will parse the threats and add them to the dictionary @@ -31,15 +30,15 @@ def parseThreats(df,diagram: component.Diagram): threat = component.Threat( df[const.Id][i], # Component ID - df[const.ThreatIDValue][i], # ID from ER + df[const.ThreatMethodID][i], # ID from ER df[const.ThreatName][i], # Name of the threat df[const.ThreatDescription][i], df[const.ThreatSource][i], df[const.Likelihood][i], ) - diagram.threats[df[const.ThreatIDValue][i]] = threat + diagram.threats[df[const.ThreatMethodID][i]] = threat - threat.findIndicatorsThreat(df, diagram, threat) # Find the indicators associated with the threat + threat.findIndicatorsThreat(df, diagram) # Find the indicators associated with the threat return diagram @@ -56,6 +55,7 @@ def parseConsequences(df, diagram: component.Diagram): df[const.ConsequenceScore][i], ) diagram.consequences[df[const.ConsequenceID][i]] = consequence + consequence.findIndicatorsConsequence(df, diagram) # Find the indicators associated with the consequence return diagram @@ -85,80 +85,53 @@ def parseArchitectureDiagram(df, diagram: component.Diagram): def parseRelationshipComponentER(df: pd.DataFrame, diagram: component.Diagram, row) -> None: relationshipComponent = df.loc[row] # Define the relationship component - - print("Parsing ER component: ", relationshipComponent[const.erName]) - print(relationshipComponent[const.textArea5]) - + indicatorList = {} # Define a list over relevant indicators to individual relationship component erComponents = {} # Define a list over ER components #* Iterate over the Relationship component to find all the indicators, and the reasoning for each - for i in range(len(6 ,relationshipComponent.columns, 2)): - indicatorID = relationshipComponent[f"Text Area {i}"].item() - indicatorReason = relationshipComponent[f"Text Area {i+1}"].item() + for i in range(6 ,len(relationshipComponent), 2): + + if pd.isnull(relationshipComponent[f"Text Area {i}"]) == True: + break + + indicatorID = relationshipComponent[f"Text Area {i}"] + indicatorReason = relationshipComponent[f"Text Area {i+1}"] indicatorList[indicatorID] = indicatorReason # * Find all the lines associated with the component linesFrom = df.loc[df[const.From] == relationshipComponent[const.Id].item()] # Find the component associated with the line linesTo = df.loc[df[const.To] == relationshipComponent[const.Id].item()] # Find the component associated with the line - linesFrom.append(linesTo) # Merge the two dataframes - + allLines = pd.concat([linesFrom, linesTo]) # Merge the two dataframes + # * Iterate through both lines, and find the ER components related to the relationship component - for i in range(len(linesFrom)): - # Defines values - erName = linesFrom[const.Name][i].item() - erID = linesFrom[const.erID][i].item() - erDescription = linesFrom[const.erDescription][i].item() - erType = linesFrom[const.erType][i].item() + for index, row in allLines.iterrows(): + objectTo = row[const.To] + objectFrom = row[const.From] + + if df.loc[df[const.Id] == objectTo][const.typeField].item() == "ER": + row = df.loc[df[const.Id] == objectFrom] + else: + row = df.loc[df[const.Id] == objectTo] + + # Defines values + name = row[const.erName].item() + entityRelationshipId = row[const.erID].item() + description = row[const.erDescription].item() + entityrelationshipType = row[const.erType].item() + # Create ER component - erComponent = component.ERComponent(erName,erID, erDescription, erType) + erComponent = component.ERComponent(name,entityRelationshipId, description, entityrelationshipType) # Add indicators to the ER component erComponent.linkedIndicators.update(indicatorList) erComponents[erComponent.id]= erComponent - for i in range (indicatorList): - indicatorID = i.key() + for i in indicatorList.keys(): # We need to update the indicators with the ER components and the reasoning for the indicator annotation - diagram.indicators[indicatorID].erAssocaites.update(erComponents) - - return diagram - - -def extractMetrics(df, index, startRange): - for j in range(startRange, len(df.columns),2): # Parse all text areas to find metrics - listOfMetrics = [] - metricID = "Text Area "+str(j) - metricName = "Text Area "+str(j+1) - - if pd.isnull(df[metricID][index]) == False: # If the text area is not empty - log.info("Metric: ID", df[metricID][index], "Name: ", df[metricName][index]) - metric = dynamic.Metric(df[metricID][index], df[metricName][index]) - listOfMetrics.append(metric) - else: - j=0 - break # First empty field indicates no more metrics - - return listOfMetrics # Returns metric found in the dynamic component - - -def joinMetrcs(localMetrics: list, globalMetrics: list) -> list: - """_summary_ - Function will use a local metric list and insert the local metrics into a global metric list - containing all the metrics in the threat landscape - :param localMetrics: List of metrics from a dynamic component - :param globalMetrics: List of metrics from the entire threat landscape - """ - duplicateMetrics = 0 # Counter for duplicate metrics per function run - for i in range(len(globalMetrics)): - for j in range(len(localMetrics)): - if globalMetrics[i].name == localMetrics[j].name: # Local metric already exists in the global metric list - duplicateMetrics += 1 - break # Check next entry - else: - globalMetrics.append(localMetrics[j]) # Add the local metric to the global metric list - log.info("New local metric added to global metric list, metric: ", localMetrics[j].name) - log.info("Added all metrics in local list \n, number of duplicate metrics: ", duplicateMetrics, "\n Number of new metrics: ", len(localMetrics)-duplicateMetrics) - return globalMetrics + index = int(i) + + diagram.indicators[index].erAssociates.update(erComponents) + return diagram \ No newline at end of file diff --git a/diagrams/TestCaseIter2.csv b/diagrams/TestCaseIter2.csv new file mode 100644 index 0000000000000000000000000000000000000000..59cc3e39e8d2985de10bcd5073cbf0c9ef501e69 --- /dev/null +++ b/diagrams/TestCaseIter2.csv @@ -0,0 +1,84 @@ +Id,Name,Shape Library,Page ID,Contained By,Group,Line Source,Line Destination,Source Arrow,Destination Arrow,Status,Text Area 1,Text Area 2,Text Area 3,Text Area 4,Text Area 5,Text Area 6,Text Area 7,Text Area 8,Text Area 9,Text Area 10,Text Area 11,Text Area 12,Text Area 13,Text Area 14,Text Area 15,Text Area 16,Text Area 17,Text Area 18,Text Area 19,Text Area 20,Text Area 21,Text Area 22,Text Area 23,Text Area 24,Text Area 25,Text Area 26,Text Area 27,Text Area 28,Text Area 29,Text Area 30,Text Area 31,Text Area 32,Text Area 33,Text Area 34,Text Area 35,Text Area 36,Text Area 37,Text Area 38,Text Area 39,Text Area 40,Text Area 41,Text Area 42,Text Area 43,Text Area 44,Text Area 45,Text Area 46,Text Area 47,Text Area 48,Text Area 49,Text Area 50,Text Area 51,Text Area 52,Text Area 53,Text Area 54,Text Area 55,Text Area 56,Text Area 57,Text Area 58,Text Area 59,Text Area 60,Text Area 61,Text Area 62,Text Area 63,Text Area 64,Text Area 65,Text Area 66,Text Area 67,Text Area 68,Text Area 69,Text Area 70,Text Area 71,Text Area 72,Text Area 73,Text Area 74,Text Area 75,Text Area 76,Text Area 77,Text Area 78,Text Area 79,Text Area 80,Text Area 81,Text Area 82,Text Area 83,Text Area 84,Text Area 85,Text Area 86,Text Area 87,Text Area 88,Text Area 89,Text Area 90,Text Area 91,Text Area 92,Text Area 93,Text Area 94,Text Area 95,Text Area 96,Text Area 97,Text Area 98,Text Area 99,Text Area 100,Text Area 101,Text Area 102,Text Area 103,Text Area 104,Text Area 105,Text Area 106,Text Area 107,Text Area 108,Text Area 109,Text Area 110,Text Area 111,Text Area 112,Text Area 113,Text Area 114,Text Area 115,Text Area 116,Text Area 117,Text Area 118,Text Area 119,Text Area 120,Text Area 121,Text Area 122,Text Area 123,Text Area 124,Text Area 125,Text Area 126,Text Area 127,Text Area 128,Text Area 129,Text Area 130,Text Area 131,Text Area 132,Text Area 133,Text Area 134,Text Area 135,Text Area 136,Text Area 137,Text Area 138,Text Area 139,Text Area 140,Text Area 141,Text Area 142,Text Area 143,Text Area 144,Text Area 145,Text Area 146,Text Area 147,Text Area 148,Text Area 149,Text Area 150,Text Area 151,Text Area 152,Text Area 153,Text Area 154,Text Area 155,Text Area 156,Text Area 157,Text Area 158,Text Area 159,Text Area 160,Text Area 161,Text Area 162,Text Area 163,Text Area 164,Text Area 165,Text Area 166,Text Area 167,Text Area 168,Text Area 169,Text Area 170,Text Area 171,Text Area 172,Text Area 173,Text Area 174,Text Area 175,Text Area 176,Text Area 177,Text Area 178,Text Area 179,Text Area 180,Text Area 181,Text Area 182,Text Area 183,Text Area 184,Comments,property 1 +1,Document,,,,,,,,,Draft,Thesis Bow-Tie and architecture,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3,Table,Tables,2,,,,,,,,Indicator ID,Indicator name,Value,1,API Response time,time,2,Build time of application,time,3,System documentation dependencies,1-5,Date,Every quarter,"Inspect 10-20 code files leveraging open source dependencies, is the code documented properly according to best practices?","1-5, 1 = poor, 5 = excellent ","Poor system documentation leads to poor visibility in the SSC, attacks and anomalies are harder to detect, moreover system documentation indicates understanding of the system meaning developers and maintainers have more knowledge regarding the system",4,System documentation frontend,1-5,Date,Every quarter,"Inspect 10-20 code files related to the front end of the system, is the code documented properly according to best practices?","1-5, 1 = poor, 5 = excellent ","Poor system documentation leads to poor visibility in the SSC, attacks and anomalies are harder to detect, moreover system documentation indicates understanding of the system meaning developers and maintainers have more knowledge regarding the system",5,Log implementation,1-5,Date,Every quarter,"Inspect 10-20 code files from the application, is logging implemented properly? Are errors and interface related functionality logged? Pay close attention to dependencies ","1-5, 1 = poor, 5 = excellent ","Appropriate logging, especially for components handling input or receiving data from open source dependencies. Logging this information is vital for detecting attacks, and determining the blast radius of an attack",6,Information handling,1-5,Date,Yearly,"Inspect code files that handles personal identifieable information, is information hashed and protected? ","1-5, 1 = poor, 5 = excellent ","Handling sensitive information especially if that information is processed, stored or fetched from open source components it is important to handle the information with care, not doing so drastically increases the consequence of infiltration or hijacking",7,Vendor partner changes,Num of partners,Date,Every quarter,"Inspect partners of the vendors leveraged in the system, are there any new vendors?","Number of new partners, Total number of partners","Vendor changes must be interpreted, some new partners may create a bigger attack surface and potentially increase the likelihood of certain hijack and/or open source attacks. Documenting the amount of partners a vendor has is important, more leads to a bigger attack surface",8,Vendor transparency,1-5,Date,Yearly,"Inspect terms and agreements of vendor, how does the vendor handle data? Is there a response plan, is the architecture of vendor systems documented? ",1-5 1 = poor transparency 5 = full transparency,"Being aware of how vendors handle data, and respond to potential attacks is vital for SSC security, by documenting the level of transparency a more accurate likelihood estimate can be made",9,Known vulnearbilities in dependencies,Yes/No,Date,Monthly,"Search vulnerability and attack databases for known security holes for important dependencies in the SSC, prioritize dependencies handling data",Yes/No,"If a vulnerability is found, discuss whether the vulnerability is relevant and/or acceptable, being aware of known vulnerabilities and having plan Bs for such dependencies reduces consequence and downtime",10,Attack trend for dependencies,1-3,Date,Monthly,"Search for inmportant dependencies on online repositories, are there a lot of variations of libraries either versions or similar libraries with typos? ",1 = Low amount 2 = Medium amount 3 = High amount,If dependencies has a lot of malicious variations this increases the likelihood of dependencies being impersonated which in turn increases likelihood of attack. THis measurement is an aggregate of all important dependencies and should be interpreted as such,11,Mean dependency rating,1-5 Average,Date,Every quarter,"Inspect repositories of important dependencies, document rating and average the score",1-5 Average,"If the average rating of the dependencies goes down the likelihood of attacks and vulnerabilities may increase due to a lack of policies, engagement, etc If the score dips below thee dependencies should be inspected to find culprits and swap them out.",12,Specific dependency documentation,1-5,Date,Monthly,"Inspect the most important dependencies in the system, give them each an indicator, inspect their documentation, focus on architecture, security policies, and general level of documentation",1-5 1 = poor documentation 5 = transparent documentation,"If important dependencies lack documentation and architecture dependencies they will spend more time finding and responding to vulnerabilities, and attacks. Important dependencies should not score below 3.",13,Specific dependency visibility,Yes/No,Date,Monthly,"If any dependencies handle sensitive information, inspect the code if possible. Can you reitarate how your data is being handled? ",Yes/No,If an important dependency handles sensitive information it is important that developers are aware of how it is being handled.,14,Code standards in supply chain,1-5,Date,Every quarter,"Inspect code standards in development teams in SSC, are they being followed? ",1-5 1 = standards are not followed 5 = standards are being followed,"If developers are not following code standards this may lead to code defects being produced which can lead to attacks and infiltrations, if standards arent being followed they might be too comprehensive",15,Maintainer load for specific dependency,Yes/No,Date,Monthly,"Inspect important dependencies, create indicators for each, is the dependency managed by One or two maintainers only? ",Yes/No,If an important dependency is managed by one or two maintainers this might mean it might be prone to infiltration and or code defects,16,Number of requirements fullfilled by open source dependencies,Number,Date,Every 6 months,"Inspect the list of requirements for the application produced by the SSC, how many requirements depend on open source dependencies",Number of requirements/Total number of requirements,Being aware of how much your SSC depends on open source functionality determines the consequence and likelihood of attacks on these dependencies,17,Assistive tools used in team,List,Date,Every 6 months,"Discuss in the development team, which tools and extensions are being used by the development team",List of tools,Being aware of which tools the team uses can be valuable to trace attacks and/or vulnerabilities in the SSC,18,Security policy organization,1-5,Date,Yearly,"Inspect and discuss the security policies of the organization responsible for the SSC, are the policies sufficient for dealing with attacks?",1-5 1 = policies are not sufficient 5 = policies are sufficient,"If security policies dont have any effect, or are to rigid leading to less efficient and resilient SSC it is noteworthy and should be documented",19,Pipeline,1-5,Date,Every quarter,"Inspect the pipeline of the SSC, is the build process secure?",1-5 1 = pipeline is insecure 5 = pipeline is secure,Periodically evaluating the security pipeline will provide insight as to how vulnerable the SSC is during the build and distribution phase of the SDLC,20,Build system,Yes/No,Date,Every quarter,"Search for vulnerabilities related to the build system of the application, are there any found vulnerabilities related to the build system, do they impact the SSC?",Yes/No,If the build system is vulnerable the developers should be aware of the risks associated with said build system as this may also impact the likelihood of attacks during build and distribution,21,Account handling,Active accounts Inactive accounts Total accounts,Date,Every quarter ,"Observe number of accounts, in the system, how many are active and inactive out of total accounts",Active accounts Inactive accounts Total accounts,Documenting amount of accounts of different nature in the system reduce the consequence and likelihood of code signing attacks since the developers are aware of which accounts should be producing code ,22,Git standards,1-5,Date ,Every 3 months,"Discuss git standards in team, is the policy being followed, are developers signing code? ",1-5 1 = standards are insufficient 5 = standards are sufficient,"Solid git standards reduces the likelihood of infiltration through VCS system, because of this the standards should be discussed",Measurement date,Frequency,Measurement guide,Scale,Interpretation of measurement,Date,Monthly,"Measure the time for all API requests, report an average time per request along with notable changes from previous measurement","ms, notable changes","If there are big changes in response time for the API, this might mean some changes have been made to logic or the endpoint may be compromised",Date,Monthly,"Measure the total build time of application from pipeline start to produced application, commonly found in build logs","ms, notable changes","If there are big changes in build time for the application, this might mean some changes have been made to logic or the SSC may be compromised",, +4,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,5,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,1,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,2,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,3,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,4,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,6,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,7,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,8,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,1,Reasoning,5,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,12,Reasoning,16,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,2,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,18,Reasoning,ID,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +16,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,4,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,7,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +18,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,22,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +19,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,7,Reasoning,15,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +20,Attack component,Entity Relationship,2,,,,,,,,Cyber Attack,Type,"Code signing, Hijack or Open source attack",Description,Brief attack description,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +22,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +23,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +26,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +28,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +29,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31,Entity relationship component,Entity Relationship,2,,,,,,,,Workstation,ID,1,Description,Developer leverages workstation to produce code,Type,Source component,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +32,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Developer provides and fetches code with repository,ID,Reasoning,ID,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33,Entity relationship component,Entity Relationship,2,,,,,,,,Codebase,ID,2,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,1,Reasoning,5,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +35,Bowtie relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Field Description,2,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36,Entity relationship component,Entity Relationship,2,,,,,,,,Backend,ID,4,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37,Bowtie relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,test,7,Reasoning,12,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +38,Entity relationship component,Entity Relationship,2,,,,,,,,Dependency,ID,5,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +39,Entity relationship component,Entity Relationship,2,,,,,,,,Frontend,ID,3,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40,Entity relationship component,Entity Relationship,2,,,,,,,,FInishedApplication,ID,6,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +41,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,2,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +42,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,4,Reasoning,15,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +43,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,7,Reasoning,8,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44,Entity relationship component,Entity Relationship,2,,,,,,,,EndUser,ID,7,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +45,Line,,2,,,5,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +46,Line,,2,,,6,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +47,Line,,2,,,7,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +48,Line,,2,,,4,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49,Line,,2,,,9,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +50,Line,,2,,,10,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +51,Line,,2,,,11,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +52,Line,,2,,,19,46,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +53,Line,,2,,,12,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +54,Line,,2,,,8,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +55,Line,,2,,,18,47,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +56,Line,,2,,,17,54,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57,Line,,2,,,13,48,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +58,Line,,2,,,14,49,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +59,Line,,2,,,15,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +60,Line,,2,,,16,51,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +61,Line,,2,,,21,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +62,Line,,2,,,22,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +63,Line,,2,,,23,46,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +64,Line,,2,,,24,47,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +65,Line,,2,,,25,54,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +66,Line,,2,,,26,48,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +67,Line,,2,,,27,49,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +68,Line,,2,,,29,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +69,Line,,2,,,28,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +70,Line,,2,,,30,51,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +71,Line,,2,,,31,32,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +72,Line,,2,,,32,33,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +73,Line,,2,,,33,34,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +74,Line,,2,,,33,35,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +75,Line,,2,,,34,36,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +76,Line,,2,,,36,37,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +77,Line,,2,,,37,38,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +78,Line,,2,,,35,39,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +79,Line,,2,,,36,41,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +80,Line,,2,,,39,42,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +81,Line,,2,,,42,40,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +82,Line,,2,,,41,40,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +83,Line,,2,,,40,43,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +84,Line,,2,,,43,44,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/diagrams/TestIter2.csv b/diagrams/TestIter2.csv new file mode 100644 index 0000000000000000000000000000000000000000..49abbcbed6f465e2f6bad741d3fa65fe56aef3bb --- /dev/null +++ b/diagrams/TestIter2.csv @@ -0,0 +1,84 @@ +Id,Name,Shape Library,Page ID,Contained By,Group,Line Source,Line Destination,Source Arrow,Destination Arrow,Status,Text Area 1,Text Area 2,Text Area 3,Text Area 4,Text Area 5,Text Area 6,Text Area 7,Text Area 8,Text Area 9,Text Area 10,Text Area 11,Text Area 12,Text Area 13,Text Area 14,Text Area 15,Text Area 16,Text Area 17,Text Area 18,Text Area 19,Text Area 20,Text Area 21,Text Area 22,Text Area 23,Text Area 24,Text Area 25,Text Area 26,Text Area 27,Text Area 28,Text Area 29,Text Area 30,Text Area 31,Text Area 32,Text Area 33,Text Area 34,Text Area 35,Text Area 36,Text Area 37,Text Area 38,Text Area 39,Text Area 40,Text Area 41,Text Area 42,Text Area 43,Text Area 44,Text Area 45,Text Area 46,Text Area 47,Text Area 48,Text Area 49,Text Area 50,Text Area 51,Text Area 52,Text Area 53,Text Area 54,Text Area 55,Text Area 56,Text Area 57,Text Area 58,Text Area 59,Text Area 60,Text Area 61,Text Area 62,Text Area 63,Text Area 64,Text Area 65,Text Area 66,Text Area 67,Text Area 68,Text Area 69,Text Area 70,Text Area 71,Text Area 72,Text Area 73,Text Area 74,Text Area 75,Text Area 76,Text Area 77,Text Area 78,Text Area 79,Text Area 80,Text Area 81,Text Area 82,Text Area 83,Text Area 84,Text Area 85,Text Area 86,Text Area 87,Text Area 88,Text Area 89,Text Area 90,Text Area 91,Text Area 92,Text Area 93,Text Area 94,Text Area 95,Text Area 96,Text Area 97,Text Area 98,Text Area 99,Text Area 100,Text Area 101,Text Area 102,Text Area 103,Text Area 104,Text Area 105,Text Area 106,Text Area 107,Text Area 108,Text Area 109,Text Area 110,Text Area 111,Text Area 112,Text Area 113,Text Area 114,Text Area 115,Text Area 116,Text Area 117,Text Area 118,Text Area 119,Text Area 120,Text Area 121,Text Area 122,Text Area 123,Text Area 124,Text Area 125,Text Area 126,Text Area 127,Text Area 128,Text Area 129,Text Area 130,Text Area 131,Text Area 132,Text Area 133,Text Area 134,Text Area 135,Text Area 136,Text Area 137,Text Area 138,Text Area 139,Text Area 140,Text Area 141,Text Area 142,Text Area 143,Text Area 144,Text Area 145,Text Area 146,Text Area 147,Text Area 148,Text Area 149,Text Area 150,Text Area 151,Text Area 152,Text Area 153,Text Area 154,Text Area 155,Text Area 156,Text Area 157,Text Area 158,Text Area 159,Text Area 160,Text Area 161,Text Area 162,Text Area 163,Text Area 164,Text Area 165,Text Area 166,Text Area 167,Text Area 168,Text Area 169,Text Area 170,Text Area 171,Text Area 172,Text Area 173,Text Area 174,Text Area 175,Text Area 176,Text Area 177,Text Area 178,Text Area 179,Text Area 180,Text Area 181,Text Area 182,Text Area 183,Text Area 184,Comments,property 1 +1,Document,,,,,,,,,Draft,Thesis Bow-Tie and architecture,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3,Table,Tables,2,,,,,,,,Indicator ID,Indicator name,Value,1,API Response time,time,2,Build time of application,time,3,System documentation dependencies,1-5,Date,Every quarter,"Inspect 10-20 code files leveraging open source dependencies, is the code documented properly according to best practices?","1-5, 1 = poor, 5 = excellent ","Poor system documentation leads to poor visibility in the SSC, attacks and anomalies are harder to detect, moreover system documentation indicates understanding of the system meaning developers and maintainers have more knowledge regarding the system",4,System documentation frontend,1-5,Date,Every quarter,"Inspect 10-20 code files related to the front end of the system, is the code documented properly according to best practices?","1-5, 1 = poor, 5 = excellent ","Poor system documentation leads to poor visibility in the SSC, attacks and anomalies are harder to detect, moreover system documentation indicates understanding of the system meaning developers and maintainers have more knowledge regarding the system",5,Log implementation,1-5,Date,Every quarter,"Inspect 10-20 code files from the application, is logging implemented properly? Are errors and interface related functionality logged? Pay close attention to dependencies ","1-5, 1 = poor, 5 = excellent ","Appropriate logging, especially for components handling input or receiving data from open source dependencies. Logging this information is vital for detecting attacks, and determining the blast radius of an attack",6,Information handling,1-5,Date,Yearly,"Inspect code files that handles personal identifieable information, is information hashed and protected? ","1-5, 1 = poor, 5 = excellent ","Handling sensitive information especially if that information is processed, stored or fetched from open source components it is important to handle the information with care, not doing so drastically increases the consequence of infiltration or hijacking",7,Vendor partner changes,Num of partners,Date,Every quarter,"Inspect partners of the vendors leveraged in the system, are there any new vendors?","Number of new partners, Total number of partners","Vendor changes must be interpreted, some new partners may create a bigger attack surface and potentially increase the likelihood of certain hijack and/or open source attacks. Documenting the amount of partners a vendor has is important, more leads to a bigger attack surface",8,Vendor transparency,1-5,Date,Yearly,"Inspect terms and agreements of vendor, how does the vendor handle data? Is there a response plan, is the architecture of vendor systems documented? ",1-5 1 = poor transparency 5 = full transparency,"Being aware of how vendors handle data, and respond to potential attacks is vital for SSC security, by documenting the level of transparency a more accurate likelihood estimate can be made",9,Known vulnearbilities in dependencies,Yes/No,Date,Monthly,"Search vulnerability and attack databases for known security holes for important dependencies in the SSC, prioritize dependencies handling data",Yes/No,"If a vulnerability is found, discuss whether the vulnerability is relevant and/or acceptable, being aware of known vulnerabilities and having plan Bs for such dependencies reduces consequence and downtime",10,Attack trend for dependencies,1-3,Date,Monthly,"Search for inmportant dependencies on online repositories, are there a lot of variations of libraries either versions or similar libraries with typos? ",1 = Low amount 2 = Medium amount 3 = High amount,If dependencies has a lot of malicious variations this increases the likelihood of dependencies being impersonated which in turn increases likelihood of attack. THis measurement is an aggregate of all important dependencies and should be interpreted as such,11,Mean dependency rating,1-5 Average,Date,Every quarter,"Inspect repositories of important dependencies, document rating and average the score",1-5 Average,"If the average rating of the dependencies goes down the likelihood of attacks and vulnerabilities may increase due to a lack of policies, engagement, etc If the score dips below thee dependencies should be inspected to find culprits and swap them out.",12,Specific dependency documentation,1-5,Date,Monthly,"Inspect the most important dependencies in the system, give them each an indicator, inspect their documentation, focus on architecture, security policies, and general level of documentation",1-5 1 = poor documentation 5 = transparent documentation,"If important dependencies lack documentation and architecture dependencies they will spend more time finding and responding to vulnerabilities, and attacks. Important dependencies should not score below 3.",13,Specific dependency visibility,Yes/No,Date,Monthly,"If any dependencies handle sensitive information, inspect the code if possible. Can you reitarate how your data is being handled? ",Yes/No,If an important dependency handles sensitive information it is important that developers are aware of how it is being handled.,14,Code standards in supply chain,1-5,Date,Every quarter,"Inspect code standards in development teams in SSC, are they being followed? ",1-5 1 = standards are not followed 5 = standards are being followed,"If developers are not following code standards this may lead to code defects being produced which can lead to attacks and infiltrations, if standards arent being followed they might be too comprehensive",15,Maintainer load for specific dependency,Yes/No,Date,Monthly,"Inspect important dependencies, create indicators for each, is the dependency managed by One or two maintainers only? ",Yes/No,If an important dependency is managed by one or two maintainers this might mean it might be prone to infiltration and or code defects,16,Number of requirements fullfilled by open source dependencies,Number,Date,Every 6 months,"Inspect the list of requirements for the application produced by the SSC, how many requirements depend on open source dependencies",Number of requirements/Total number of requirements,Being aware of how much your SSC depends on open source functionality determines the consequence and likelihood of attacks on these dependencies,17,Assistive tools used in team,List,Date,Every 6 months,"Discuss in the development team, which tools and extensions are being used by the development team",List of tools,Being aware of which tools the team uses can be valuable to trace attacks and/or vulnerabilities in the SSC,18,Security policy organization,1-5,Date,Yearly,"Inspect and discuss the security policies of the organization responsible for the SSC, are the policies sufficient for dealing with attacks?",1-5 1 = policies are not sufficient 5 = policies are sufficient,"If security policies dont have any effect, or are to rigid leading to less efficient and resilient SSC it is noteworthy and should be documented",19,Pipeline,1-5,Date,Every quarter,"Inspect the pipeline of the SSC, is the build process secure?",1-5 1 = pipeline is insecure 5 = pipeline is secure,Periodically evaluating the security pipeline will provide insight as to how vulnerable the SSC is during the build and distribution phase of the SDLC,20,Build system,Yes/No,Date,Every quarter,"Search for vulnerabilities related to the build system of the application, are there any found vulnerabilities related to the build system, do they impact the SSC?",Yes/No,If the build system is vulnerable the developers should be aware of the risks associated with said build system as this may also impact the likelihood of attacks during build and distribution,21,Account handling,Active accounts Inactive accounts Total accounts,Date,Every quarter ,"Observe number of accounts, in the system, how many are active and inactive out of total accounts",Active accounts Inactive accounts Total accounts,Documenting amount of accounts of different nature in the system reduce the consequence and likelihood of code signing attacks since the developers are aware of which accounts should be producing code ,22,Git standards,1-5,Date ,Every 3 months,"Discuss git standards in team, is the policy being followed, are developers signing code? ",1-5 1 = standards are insufficient 5 = standards are sufficient,"Solid git standards reduces the likelihood of infiltration through VCS system, because of this the standards should be discussed",Measurement date,Frequency,Measurement guide,Scale,Interpretation of measurement,Date,Monthly,"Measure the time for all API requests, report an average time per request along with notable changes from previous measurement","ms, notable changes","If there are big changes in response time for the API, this might mean some changes have been made to logic or the endpoint may be compromised",Date,Monthly,"Measure the total build time of application from pipeline start to produced application, commonly found in build logs","ms, notable changes","If there are big changes in build time for the application, this might mean some changes have been made to logic or the SSC may be compromised",, +4,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,5,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,1,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,2,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,3,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8,Threat component,Entity Relationship,2,,,,,,,,Threat,ID,4,Name,Name of threat,Description,Brief threat description,Threat source,"The actor or ""thing"" responsible for the threat",Likelihood,The likelihood of the threat being exploited,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,6,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,7,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11,Consequence component,Entity Relationship,2,,,,,,,,Consequence,ID,8,Description,Description of the consequence of the attack type occuring,Consequence lvl,Consequence score based on affected components,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,1,Reasoning,5,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,12,Reasoning,16,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,2,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,18,Reasoning,ID,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +16,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Consequence,4,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,7,Reasoning,6,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +18,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,22,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +19,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,Threat,7,Reasoning,15,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +20,Attack component,Entity Relationship,2,,,,,,,,Cyber Attack,Type,"Code signing, Hijack or Open source attack",Description,Brief attack description,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +22,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +23,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25,Entity,Entity Relationship,2,,,,,,,,Barrier,Preventative measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +26,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +28,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +29,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30,Entity,Entity Relationship,2,,,,,,,,Barrier,Reductive measure,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31,Entity relationship component,Entity Relationship,2,,,,,,,,Workstation,ID,1,Description,Developer leverages workstation to produce code,Type,Source component,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +32,Entity,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Developer provides and fetches code with repository,4,Reasoning,5,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33,Entity relationship component,Entity Relationship,2,,,,,,,,Codebase,ID,2,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,1,Reasoning,5,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +35,Bowtie relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Field Description,2,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36,Entity relationship component,Entity Relationship,2,,,,,,,,Backend,ID,4,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37,Bowtie relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,test,7,Reasoning,12,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +38,Entity relationship component,Entity Relationship,2,,,,,,,,Dependency,ID,5,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +39,Entity relationship component,Entity Relationship,2,,,,,,,,Frontend,ID,3,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40,Entity relationship component,Entity Relationship,2,,,,,,,,FInishedApplication,ID,6,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +41,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,2,Reasoning,3,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +42,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,4,Reasoning,15,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +43,ER Relationship,Entity Relationship,2,,,,,,,,Relationship,Type,ER,Description,Description of relationship,7,Reasoning,8,Reasoning,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44,Entity relationship component,Entity Relationship,2,,,,,,,,EndUser,ID,7,Description,String,Type,Component type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +45,Line,,2,,,5,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +46,Line,,2,,,6,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +47,Line,,2,,,7,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +48,Line,,2,,,4,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49,Line,,2,,,9,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +50,Line,,2,,,10,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +51,Line,,2,,,11,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +52,Line,,2,,,19,46,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +53,Line,,2,,,12,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +54,Line,,2,,,8,20,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +55,Line,,2,,,18,47,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +56,Line,,2,,,17,54,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57,Line,,2,,,13,48,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +58,Line,,2,,,14,49,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +59,Line,,2,,,15,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +60,Line,,2,,,16,51,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +61,Line,,2,,,21,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +62,Line,,2,,,22,45,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +63,Line,,2,,,23,46,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +64,Line,,2,,,24,47,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +65,Line,,2,,,25,54,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +66,Line,,2,,,26,48,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +67,Line,,2,,,27,49,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +68,Line,,2,,,29,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +69,Line,,2,,,28,50,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +70,Line,,2,,,30,51,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +71,Line,,2,,,31,32,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +72,Line,,2,,,32,33,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +73,Line,,2,,,33,34,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +74,Line,,2,,,33,35,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +75,Line,,2,,,34,36,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +76,Line,,2,,,36,37,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +77,Line,,2,,,37,38,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +78,Line,,2,,,35,39,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +79,Line,,2,,,36,41,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +80,Line,,2,,,39,42,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +81,Line,,2,,,42,40,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +82,Line,,2,,,41,40,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +83,Line,,2,,,40,43,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +84,Line,,2,,,43,44,CFN ERD One Arrow,CFN ERD Many Arrow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/dynamics.py b/dynamics.py deleted file mode 100644 index a3320b6984cb77e16aefa58162a0fb07fa19ec80..0000000000000000000000000000000000000000 --- a/dynamics.py +++ /dev/null @@ -1,203 +0,0 @@ -import ERFormatConstants as const -import logging as log -import components as component - - - #Metric class, will be used for all dynamics -class Indicator: - """ - The metric class is associated with all the dynamics components AND the matrix - The initial creation of metrics is done through the dynamic units, there the init function is used to create the metrics, - and fill them with the correct associated components (erID, bowtieID) - When the object is then accessed again for the matrix parse the metrics are filled with the correct values - """ - def __init__(self, ID, name, value, date, frequency, guide, scale, interpretation) -> None: - """ - Metrics are created when parsing dynamics and are there filled with args - When the matrix is parsed the metrics are filled with the correct values - Args: - ID (str): Unique ID for the metric - name (str): Unique name for the metric - """ - #Metrics found in the dynamics tables - self.erAssociates: dict[int, component.ERComponent] = {} # ID of the metric used to locate in dynamics matrics - self.threatAssoicates: dict[str, component.Threat] = {} # ID of the metric used to locate in dynamics matrics - self.consequenceAssociates: dict[str, component.Consequence] = {} # ID of the metric used to locate in dynamics matrics - self.attackAssociates: dict[int, component.Attack] = {} # ID of the metric used to locate in dynamics matrics - - - self.indicatorID = ID # ID of the metric used to locate in dynamics matrics - self.indicatorName = name # Name of the metric - self.value = value # Value of the metric - self.date = date # Date of the metric - self.frequency = frequency # Frequency of the metric - self.measureGuide =guide # Measure guide of the metric - self.scale = scale # Scale of the metric - self.interpretation = interpretation # Interpretation of the metric - - - def __str__(self) -> str: - return f"Metric: {self.name}, Value: {self.value} Last update: {self.date}" - - - -def linkMetric(self, df, metricsDict: dict): - """ - Function will extract all the metrics from the dynamics component, add it to the local metric list of the dynamic component, - the function also adds the metric to the global metric list (if its not already there) and and links the dynamic component to the metric, - through the associatedER and associatedAttack lists in the metric class - - Args: - df (pandas Dataframe): The original dataframe being parsed from lucidchart - metricsDict (dict): The metricsdict is the global metric list, it contains all the metrics in the diagram - """ - - dynamicComponent = df.loc[df[const.Id] == self.componentID] # Finds the dynamic component we are extracting metrics from - for i in range (4, len(dynamicComponent.columns), 2): # Iterate through all the metrics - - if(dynamicComponent["Text Area "+str(i)].isnull().values.any() == True): # If there are no metrics left - break # Break the loop - - metricID = dynamicComponent["Text Area "+str(i)].item() # Find the metric ID in the component - metricID = int(metricID) - - metricName = dynamicComponent["Text Area "+str(i+1)].item() # Find the metric Name - - self.metrics.append(metricID) # ? Adds the metric to the metric list associated with the dynamic component specifically - - if checkDuplicateMetrics(metricsDict, metricID) == False: # If the metric is in the global list - metric = Metric(metricID, metricName) # Create a new metric object - else: - metric = metricsDict[metricID] # Find the metric - - if self.type == const.ThreatDynamic: # If the dynamic component is a threat - if checkDuplicate(metric.bowtieID, self.associatedThreat[const.Id].item()): #* If the threat component is associated with the metric - continue # * We wont add it to the metric threatList and attack list since its already there - metric.bowtieID.append(self.associatedThreat[const.Id].item()) # ? Adds the associated threat to the metric - - elif self.type == const.ConsequenceDynamic: # Same procedure as if above - if checkDuplicate(metric.bowtieID, self.associatedConsequence[const.Id].item()): - continue - metric.bowtieID.append(self.associatedConsequence[const.Id].item()) - - if checkDuplicate(metric.bowtieID, self.associatedAttack[const.Id].item()): #* If the associated component is a duplicate - continue - metric.bowtieID.append(self.associatedAttack[const.Id].item()) - - metricsDict[metricID] = metric # ! Adds the metric to the global metric list - -class ERDynamic(DynamicComponent): - """ - The ER dynamic inherits the dynamic component and adds associated ER components - Contains its own associate function and its own linkMetric function to link metrics - Has a description and a list of associated ER components - - Args: - DynamicComponent (class): parent class - """ - def __init__(self, componentID, type, description) -> None: - super().__init__(componentID) - - self.description = description # Description of the dynamic - self.associatedERComponents = {} # Associated ER component - self.type = type - - def __str__(self) -> str: - return super().__str__() + f"ER Dynamic: {self.type}, {self.description}, Amount of associated components {len(self.associatedERComponents)}" - - - def associatER(self, df, metricsDict: dict): - """ - Function will associate the ER dynamic with the correct components - The function will also link the metrics to the ER dynamic component - The function will also add the metrics to the global metric list - - Args: - df (pandas Dataframe): The original dataframe being parsed from lucidchart - metricsDict (dict): The metricsdict is the global metric list, it contains all the metrics in the diagram - """ - componentId = self.componentID # Define the ID of the component - - #Find the lines associated with the component - lines = df.loc[df['Name']=='Line'] # Find all lines in the diagram - relevantLines = [] # List of lines relevant to the component - - for i in range(len(lines)): - line = lines.iloc[i] - - if line[const.From] == componentId or line[const.To] == componentId: # If the line is associated with the component - relevantLines.append(lines.iloc[i]) # Add the line to the relevant lines list - - for i in range(len(relevantLines)): - line = relevantLines[i] - lineSource = line[const.From] # The source of the line - lineDestination = line[const.To] - - if lineSource == componentId: # If the line is associated with the component - associatedComponentID = lineDestination - else: - associatedComponentID = lineSource - associatedComponent = df.iloc[df.index[df[const.Id] == associatedComponentID]] # Find the component associated with the line - associatedComponentRegularID = associatedComponent[const.textArea3].item() # Find the ID of the associated component - associatedComponentName = associatedComponent[const.textArea1].item() # Find the description of the associated component - - self.associatedERComponents[associatedComponentRegularID] = associatedComponentName # Add the associated component to the list of associated components - - self.linkMetric(df, metricsDict) # Link the metrics to the ER dynamic component - - def linkMetric(self,df, metricsDict): - """ - Links the metrics to the ER dynamic component and adds the metrics to the global metric list - - Args: - df (Dataframe): The original dataframe being parsed from lucidchart - metricsDict (dict): The metricsdict is the global metric list, it contains all the metrics in the diagram - """ - - dynamicComponent = df.loc[df[const.Id] == self.componentID] # Find the dynamic component - - for i in range (6, len(dynamicComponent.columns), 2): # Iterate through all the metrics - - if(dynamicComponent["Text Area "+str(i)].isnull().values.any() == True): # No more metrics - break - - metricID = dynamicComponent["Text Area "+str(i)].item() # Find the metric ID - metricID = int(metricID) - - metricName = dynamicComponent["Text Area "+str(i+1)].item() # Find the metric ID - - self.metrics.append(metricID) # ? Adds the metric to the metric list associated with the dynamic component specifically - - if checkDuplicateMetrics(metricsDict, metricID) == False: # If the metric is not a duplicate - metric = Metric(metricID, metricName) # Create a new metric object - else: - metric = metricsDict[metricID] - - for i in self.associatedERComponents.keys(): - erID = i - - if checkDuplicate(metric.erID, erID): #* If the associated component is a duplicate - continue - metric.erID.append(erID) - metricsDict[metricID] = metric # ! Adds the metric to the global metric list - -def checkDuplicateMetrics(metricsDict: dict, metricID: str): - """_summary_ - Function will check if the diagrams metric dict contains a metric, - with the same ID as the one which is listed in the dynamics component, if it does - """ - - if metricID in metricsDict.keys(): - return True - - else: - return False - -def checkDuplicate(list: list, id: str): - """_summary_ - Check if the already contains the associated component - """ - if id in list: - return True - else: - return False \ No newline at end of file diff --git a/main.py b/main.py index 033cdf79a897be62f42684c1049da4821b46f3f4..bce6a625da6666f7d26044ed28f6b97838ebce45 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,3 @@ -import dynamics as dyn import diagramParser as parse def main(): @@ -6,7 +5,7 @@ def main(): dynamicMetricsBowtie = [] # List of metrics for the bowtie model dynamicMetricsArchitecture = [] # List of metrics for the architecture #parse.parseDiagramFile('diagrams/Thesis Bow-Tie and architecture - Meta model-2.csv') # Parse the diagram - diagram = parse.parseDiagramFile('diagrams/DiagramTest3.csv') # Parse the diagram + diagram = parse.parseDiagramFile('diagrams/TestIter2.csv') # Parse the diagram if __name__=="__main__": diff --git a/matrices.py b/matrices.py index e3007d98524034066cea337fc0a9f824f19efce9..169824cf87008b80bd2c9f534fc49964350cd9d5 100644 --- a/matrices.py +++ b/matrices.py @@ -1,7 +1,6 @@ import pandas as pd import ERFormatConstants as const import components as component -import dynamics as dynamic """_summary_ Parses csv table and returns a dataframe @@ -10,7 +9,7 @@ This is quite a big EDGE case and will only work for the specific table shape th """ def parseTable(df, diagram: component.Diagram) -> component.Diagram: - cols = [const.Metric_ID, const.Metric_Name, const.Value, const.Measure_date, const.Frequency ,const.Measurement_guide, const.Scale, const.Interpretation] + cols = [const.indicatorID, const.indicatorName, const.Value, const.Measure_date, const.Frequency ,const.Measurement_guide, const.Scale, const.Interpretation] table = df.loc[df[const.Name]=='Table'] # Defines the table @@ -26,11 +25,11 @@ def parseTable(df, diagram: component.Diagram) -> component.Diagram: # * Etc - startStandardIndicators = 21-4 # Column 21-4 - stopStandardIndicators = 180-4 # First loop needs to stop at column 180-4, 4 columns are removed in diagramParser.py + startStandardIndicators = 10 # Column 21-4 + stopStandardIndicators = 169 # First loop needs to stop at column 180-4, 4 columns are removed in diagramParser.py interval = len(cols) - startSpecialIndicators = 196-4 # Text area 185 - stopSpecializedIndicators = len(table.columns)-2 + startSpecialIndicators = 185 # Text area 185 + stopSpecializedIndicators = len(table.columns) @@ -46,7 +45,7 @@ def parseTable(df, diagram: component.Diagram) -> component.Diagram: indicatorID1 = int(indicatorID1) # Convert indicator to int #* Create indicator object - indicator1 = dynamic.Indicator( + indicator1 = component.Indicator( indicatorID1, indicatorName1, Value1, @@ -70,7 +69,7 @@ def parseTable(df, diagram: component.Diagram) -> component.Diagram: IndicatorID2 = int(IndicatorID2) - indicator2 = dynamic.Indicator( + indicator2 = component.Indicator( IndicatorID2, IndicatorName2, Value2, @@ -88,43 +87,59 @@ def parseTable(df, diagram: component.Diagram) -> component.Diagram: break IndicatorID = table["Text Area "+str(i)].item() # Define the Metric ID + IndicatorID = int(IndicatorID) IndicatorName = table["Text Area "+str(i+1)].item() # Define the Metric Name Value = table["Text Area "+str(i+2)].item() # Define the Value MeasureDate = table["Text Area "+str(i+3)].item() # Define the Measure Date Frequency = table["Text Area "+str(i+4)].item() # Define the Frequency Guide = table["Text Area "+str(i+5)].item() # Define the Measurement guide + Scale = table["Text Area "+str(i+6)].item() + Interpretation = table["Text Area "+str(i+7)].item() - indicator = dynamic.Indicator( + indicator = component.Indicator( IndicatorID, IndicatorName, Value, MeasureDate, Frequency, - Guide + Guide, + Scale, + Interpretation ) diagram.indicators[IndicatorID] = indicator # Insert indicator into diagram dictionary # ! Parsing will then continue from the last row, row 24, and onwards with usual text areas for specialized indicators for i in range(startSpecialIndicators, stopSpecializedIndicators, interval): + + if stopSpecializedIndicators == 191: + break + if i >= stopSpecializedIndicators: break IndicatorID = table["Text Area "+str(i)].item() # Define the Metric ID + IndicatorID = int(IndicatorID) IndicatorName = table["Text Area "+str(i+1)].item() # Define the Metric Name Value = table["Text Area "+str(i+2)].item() # Define the Value MeasureDate = table["Text Area "+str(i+3)].item() # Define the Measure Date Frequency = table["Text Area "+str(i+4)].item() # Define the Frequency Guide = table["Text Area "+str(i+5)].item() # Define the Measurement guide + Scale = table["Text Area "+str(i+6)].item() + Interpretation = table["Text Area "+str(i+7)].item() - indicator = dynamic.Indicator( + + indicator = component.Indicator( IndicatorID, IndicatorName, Value, MeasureDate, Frequency, - Guide + Guide, + Scale, + Interpretation ) diagram.indicators[IndicatorID] = indicator + - + return diagram \ No newline at end of file