marcilioduarte commited on
Commit
75b9644
·
1 Parent(s): 25efed1

Restore full project refactor with scripts and clean tracked artifacts

Browse files
README.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Credit Worthiness Risk Classification
2
+
3
+ End-to-end classification case study for credit risk prediction, including preprocessing, model selection, and app delivery.
4
+
5
+ ## Objective
6
+
7
+ Build and evaluate models to classify credit applicants by risk profile in a reproducible workflow.
8
+
9
+ ## What Is Included
10
+
11
+ - data preparation and feature engineering steps;
12
+ - supervised models: Logistic Regression, Decision Tree, Random Forest;
13
+ - hyperparameter tuning with `GridSearchCV`;
14
+ - model evaluation pipeline;
15
+ - lightweight Gradio app for interactive inference (`app.py`).
16
+
17
+ ## Dataset
18
+
19
+ - Local path: `data/raw/german_credit.csv`
20
+ - Source: [Kaggle - German Credit Dataset](https://www.kaggle.com/datasets/mpwolke/cusersmarildownloadsgermancsv)
21
+
22
+ ## Run Locally
23
+
24
+ ```bash
25
+ pip install -r requirements.txt
26
+ python app.py
27
+ ```
28
+
29
+ ## Project Metadata
30
+
31
+ - `sdk`: gradio
32
+ - `sdk_version`: 3.27.0
33
+ - `app_file`: `app.py`
34
+ - `license`: Apache-2.0
app.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## IMPORTING LIBS
2
+
3
+ import pandas as pd
4
+ import plotly.express as px
5
+
6
+ from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix
7
+
8
+ import pickle
9
+ import gradio as gr
10
+
11
+ ## CREATING FUNCTION
12
+
13
+ def predict_credit_worthiness(name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22):
14
+ path = 'german_credit_risk/model/model.pickle'
15
+ greet = 'Hey, ' + name + '!'
16
+ with open(path, 'rb') as file:
17
+ model = pickle.load(file)
18
+ inputs = {'Account Balance_1': int(x1),
19
+ 'Account Balance_2': int(x2),
20
+ 'Account Balance_3': int(x3),
21
+ 'Payment Status of Previous Credit_1': int(x4),
22
+ 'Payment Status of Previous Credit_3': int(x5),
23
+ 'Purpose_1': int(x6),
24
+ 'Purpose_4': int(x7),
25
+ 'Value Savings/Stocks_1': int(x8),
26
+ 'Value Savings/Stocks_3': int(x9),
27
+ 'Value Savings/Stocks_5': int(x10),
28
+ 'Length of current employment_1': int(x11),
29
+ 'Length of current employment_4': int(x12),
30
+ 'Instalment per cent_4': int(x13),
31
+ 'Guarantors_1': int(x14),
32
+ 'Duration in Current address_1': int(x15),
33
+ 'Duration in Current address_2': int(x16),
34
+ 'Most valuable available asset_1': int(x17),
35
+ 'Most valuable available asset_4': int(x18),
36
+ 'Concurrent Credits_3': int(x19),
37
+ 'Type of apartment_1': int(x20),
38
+ 'No of Credits at this Bank_1': int(x21),
39
+ 'Occupation_1': int(x22)
40
+ }
41
+ prediction = model.predict([list(inputs.values())])
42
+
43
+ y_test = pd.read_parquet('german_credit_risk/data/processed/y_test.parquet')
44
+ y_test = y_test.squeeze()
45
+
46
+ yhat = pd.read_parquet('german_credit_risk/data/processed/yhat.parquet')
47
+ yhat = yhat.squeeze()
48
+
49
+ precision = precision_score(y_test, yhat).round(2)
50
+ recall = recall_score(y_test, yhat).round(2)
51
+ f1 = f1_score(y_test, yhat).round(2)
52
+
53
+ features_names = ['No account', 'No balance', 'Some balance', 'No credit problems',
54
+ 'Some credit problems', 'New car', 'Other purpose', 'No savings',
55
+ 'DM betwenn [100, 1000]', 'DM >= 1000', 'Employment: <1 year (or unemployed)', 'Employment: 4<x<7 years',
56
+ 'Installment smaller than 20%', 'No guarantors', 'Less than a year in same address', '1<x<4 years in address',
57
+ 'Not available / no assets', 'Ownership of house or land', 'No further running credits', 'Free ap',
58
+ 'One credit at thins bank','Unemployed or unskilled']
59
+ importance = model.feature_importances_
60
+ data = pd.DataFrame()
61
+ data['Feature Importance'] = importance
62
+ data['Feature'] = features_names
63
+ p = px.bar(data, y='Feature Importance', x='Feature', width=1200, height=500)
64
+
65
+ cfm = confusion_matrix(y_test, yhat)
66
+ cfm_plot = px.imshow(cfm,
67
+ x=['Predicted 0', 'Predicted 1'],
68
+ y=['Actual 0', 'Actual 1'],
69
+ color_continuous_scale='Blues',
70
+ labels=dict(x="Predicted", y="Actual", color="Count"),
71
+ text_auto=True)
72
+
73
+ if prediction == 1:
74
+ return (greet + ' According to our model, your client is eligible for the loan.',
75
+ 'Precision: '+ str(precision),
76
+ 'Recall: '+ str(recall),
77
+ 'F1 Score: '+ str(f1),
78
+ p,
79
+ cfm_plot)
80
+ else:
81
+ return (greet + ' Unfortunately, according to our model, your client is not eligible for the loan for now :(.',
82
+ 'Precision: '+ str(precision),
83
+ 'Recall: '+ str(recall),
84
+ 'F1 Score: '+ str(f1),
85
+ p,
86
+ cfm_plot)
87
+
88
+ ## creating the interface
89
+
90
+ with gr.Blocks() as demo:
91
+ gr.Markdown('# Credit Worthiness Prediction')
92
+ gr.Markdown("""
93
+ To predict our clients' creditworthiness, please use this application as follows:
94
+
95
+ 1. Enter your name and navigate through the client's information tabs. Select the boxes that best match your client's characteristics. Leave blank if none apply.
96
+
97
+ 2. Once completed, click 'Predict' to determine if the client is creditworthy.
98
+ """)
99
+ with gr.Accordion('Name'):
100
+ name = gr.Textbox(lines=1, label='Your name')
101
+ with gr.Accordion("Enter your client's information"):
102
+ with gr.Tab('Account Balance'):
103
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
104
+ x1 = gr.Checkbox(1, label='No account')
105
+ x2 = gr.Checkbox(0, label='No balance')
106
+ x3 = gr.Checkbox(0, label='Some balance')
107
+ with gr.Tab('Payment status of previous credit'):
108
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
109
+ x4 = gr.Checkbox(1, label='Some problems')
110
+ x5 = gr.Checkbox(0, label='No problems in this bank')
111
+ with gr.Tab('Purpose'):
112
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
113
+ x6 = gr.Checkbox(1, label='New car')
114
+ x7 = gr.Checkbox(0, label='Other')
115
+ with gr.Tab('Value savings/stocks'):
116
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
117
+ x8 = gr.Checkbox(1, label='No savings')
118
+ x9 = gr.Checkbox(0, label='DM betwenn [100, 1000]')
119
+ x10 = gr.Checkbox(0, label='DM >= 1000')
120
+ with gr.Tab('Length of current employment'):
121
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
122
+ x11 = gr.Checkbox(1, label='Below 1 year (or unemployed)')
123
+ x12 = gr.Checkbox(0, label='Between 4 and 7 years')
124
+ with gr.Tab('Instalment per cent'):
125
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
126
+ x13 = gr.Checkbox(0, label='Smaller than 20%')
127
+ with gr.Tab('Guarantors'):
128
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
129
+ x14 = gr.Checkbox(0, label='No guarantors')
130
+ with gr.Tab('Duration in current address'):
131
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
132
+ x15 = gr.Checkbox(1, label='Less than a year')
133
+ x16 = gr.Checkbox(0, label='Between 1 and 4 years')
134
+ with gr.Tab('Most valuable available asset'):
135
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
136
+ x17 = gr.Checkbox(1, label='Not available / no assets')
137
+ x18 = gr.Checkbox(0, label='Ownership of house or land')
138
+ with gr.Tab('Concurrent credits'):
139
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
140
+ x19 = gr.Checkbox(0, label='No further running credits')
141
+ with gr.Tab('Type of apartment'):
142
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
143
+ x20 = gr.Checkbox(0, label='Free apartment')
144
+ with gr.Tab('Number of credits at this Bank'):
145
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
146
+ x21 = gr.Checkbox(0, label='One credit')
147
+ with gr.Tab('Occupation'):
148
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
149
+ x22 = gr.Checkbox(0, label='Unemployed or unskilled with no permanent')
150
+ predict_button = gr.Button('Predict')
151
+ prediction_output = gr.Label(num_top_classes=2)
152
+ with gr.Accordion('Metrics and plots'):
153
+ with gr.Tab('Metrics'):
154
+ with gr.Row():
155
+ precision_output = gr.Label()
156
+ with gr.Row():
157
+ recall_output = gr.Label()
158
+ with gr.Row():
159
+ f1_output = gr.Label()
160
+ with gr.Tab('Feature Importances'):
161
+ fimp_output = gr.Plot()
162
+ with gr.Tab('Confusion Matrix'):
163
+ cfm_output = gr.Plot()
164
+ predict_button.click(fn=predict_credit_worthiness,
165
+ inputs=[name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22],
166
+ outputs=[prediction_output,precision_output, recall_output, f1_output, fimp_output, cfm_output])
167
+ gr.Markdown('''
168
+ Want to work in a project together or have interest in my services? Reach me:
169
+ [Linkedin](https://www.linkedin.com/in/marcilioduarte98/)
170
+ [Github](https://github.com/marcilioduarte)
171
+ @marcilioduarte | Economics and Data Science
172
+ ''')
173
+ demo.launch()
code/processed/gcrisk.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## IMPORTING LIBS
2
+
3
+ import pandas as pd
4
+ import plotly.express as px
5
+
6
+ from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix
7
+
8
+ import pickle
9
+ import gradio as gr
10
+
11
+ ## CREATING FUNCTION
12
+
13
+ def predict_credit_worthiness(name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22):
14
+ path = 'german_credit_risk/model/model.pickle'
15
+ greet = 'Hey, ' + name + '!'
16
+ with open(path, 'rb') as file:
17
+ model = pickle.load(file)
18
+ inputs = {'Account Balance_1': int(x1),
19
+ 'Account Balance_2': int(x2),
20
+ 'Account Balance_3': int(x3),
21
+ 'Payment Status of Previous Credit_1': int(x4),
22
+ 'Payment Status of Previous Credit_3': int(x5),
23
+ 'Purpose_1': int(x6),
24
+ 'Purpose_4': int(x7),
25
+ 'Value Savings/Stocks_1': int(x8),
26
+ 'Value Savings/Stocks_3': int(x9),
27
+ 'Value Savings/Stocks_5': int(x10),
28
+ 'Length of current employment_1': int(x11),
29
+ 'Length of current employment_4': int(x12),
30
+ 'Instalment per cent_4': int(x13),
31
+ 'Guarantors_1': int(x14),
32
+ 'Duration in Current address_1': int(x15),
33
+ 'Duration in Current address_2': int(x16),
34
+ 'Most valuable available asset_1': int(x17),
35
+ 'Most valuable available asset_4': int(x18),
36
+ 'Concurrent Credits_3': int(x19),
37
+ 'Type of apartment_1': int(x20),
38
+ 'No of Credits at this Bank_1': int(x21),
39
+ 'Occupation_1': int(x22)
40
+ }
41
+ prediction = model.predict([list(inputs.values())])
42
+
43
+ y_test = pd.read_parquet('german_credit_risk/data/processed/y_test.parquet')
44
+ y_test = y_test.squeeze()
45
+
46
+ yhat = pd.read_parquet('german_credit_risk/data/processed/yhat.parquet')
47
+ yhat = yhat.squeeze()
48
+
49
+ precision = precision_score(y_test, yhat).round(2)
50
+ recall = recall_score(y_test, yhat).round(2)
51
+ f1 = f1_score(y_test, yhat).round(2)
52
+
53
+ features_names = ['No account', 'No balance', 'Some balance', 'No credit problems',
54
+ 'Some credit problems', 'New car', 'Other purpose', 'No savings',
55
+ 'DM betwenn [100, 1000]', 'DM >= 1000', 'Employment: <1 year (or unemployed)', 'Employment: 4<x<7 years',
56
+ 'Installment smaller than 20%', 'No guarantors', 'Less than a year in same address', '1<x<4 years in address',
57
+ 'Not available / no assets', 'Ownership of house or land', 'No further running credits', 'Free ap',
58
+ 'One credit at thins bank','Unemployed or unskilled']
59
+ importance = model.feature_importances_
60
+ data = pd.DataFrame()
61
+ data['Feature Importance'] = importance
62
+ data['Feature'] = features_names
63
+ p = px.bar(data, y='Feature Importance', x='Feature', width=1200, height=500)
64
+
65
+ cfm = confusion_matrix(y_test, yhat)
66
+ cfm_plot = px.imshow(cfm,
67
+ x=['Predicted 0', 'Predicted 1'],
68
+ y=['Actual 0', 'Actual 1'],
69
+ color_continuous_scale='Blues',
70
+ labels=dict(x="Predicted", y="Actual", color="Count"),
71
+ text_auto=True)
72
+
73
+ if prediction == 1:
74
+ return (greet + ' According to our model, your client is eligible for the loan.',
75
+ 'Precision: '+ str(precision),
76
+ 'Recall: '+ str(recall),
77
+ 'F1 Score: '+ str(f1),
78
+ p,
79
+ cfm_plot)
80
+ else:
81
+ return (greet + ' Unfortunately, according to our model, your client is not eligible for the loan for now :(.',
82
+ 'Precision: '+ str(precision),
83
+ 'Recall: '+ str(recall),
84
+ 'F1 Score: '+ str(f1),
85
+ p,
86
+ cfm_plot)
87
+
88
+ ## creating the interface
89
+
90
+ with gr.Blocks() as demo:
91
+ gr.Markdown('# Credit Worthiness Prediction')
92
+ gr.Markdown("""
93
+ To predict our clients' creditworthiness, please use this application as follows:
94
+
95
+ 1. Enter your name and navigate through the client's information tabs. Select the boxes that best match your client's characteristics. Leave blank if none apply.
96
+
97
+ 2. Once completed, click 'Predict' to determine if the client is creditworthy.
98
+ """)
99
+ with gr.Accordion('Name'):
100
+ name = gr.Textbox(lines=1, label='Your name')
101
+ with gr.Accordion("Enter your client's information"):
102
+ with gr.Tab('Account Balance'):
103
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
104
+ x1 = gr.Checkbox(1, label='No account')
105
+ x2 = gr.Checkbox(0, label='No balance')
106
+ x3 = gr.Checkbox(0, label='Some balance')
107
+ with gr.Tab('Payment status of previous credit'):
108
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
109
+ x4 = gr.Checkbox(1, label='Some problems')
110
+ x5 = gr.Checkbox(0, label='No problems in this bank')
111
+ with gr.Tab('Purpose'):
112
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
113
+ x6 = gr.Checkbox(1, label='New car')
114
+ x7 = gr.Checkbox(0, label='Other')
115
+ with gr.Tab('Value savings/stocks'):
116
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
117
+ x8 = gr.Checkbox(1, label='No savings')
118
+ x9 = gr.Checkbox(0, label='DM betwenn [100, 1000]')
119
+ x10 = gr.Checkbox(0, label='DM >= 1000')
120
+ with gr.Tab('Length of current employment'):
121
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
122
+ x11 = gr.Checkbox(1, label='Below 1 year (or unemployed)')
123
+ x12 = gr.Checkbox(0, label='Between 4 and 7 years')
124
+ with gr.Tab('Instalment per cent'):
125
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
126
+ x13 = gr.Checkbox(0, label='Smaller than 20%')
127
+ with gr.Tab('Guarantors'):
128
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
129
+ x14 = gr.Checkbox(0, label='No guarantors')
130
+ with gr.Tab('Duration in current address'):
131
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
132
+ x15 = gr.Checkbox(1, label='Less than a year')
133
+ x16 = gr.Checkbox(0, label='Between 1 and 4 years')
134
+ with gr.Tab('Most valuable available asset'):
135
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
136
+ x17 = gr.Checkbox(1, label='Not available / no assets')
137
+ x18 = gr.Checkbox(0, label='Ownership of house or land')
138
+ with gr.Tab('Concurrent credits'):
139
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
140
+ x19 = gr.Checkbox(0, label='No further running credits')
141
+ with gr.Tab('Type of apartment'):
142
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
143
+ x20 = gr.Checkbox(0, label='Free apartment')
144
+ with gr.Tab('Number of credits at this Bank'):
145
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
146
+ x21 = gr.Checkbox(0, label='One credit')
147
+ with gr.Tab('Occupation'):
148
+ gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
149
+ x22 = gr.Checkbox(0, label='Unemployed or unskilled with no permanent')
150
+ predict_button = gr.Button('Predict')
151
+ prediction_output = gr.Label(num_top_classes=2)
152
+ with gr.Accordion('Metrics and plots'):
153
+ with gr.Tab('Metrics'):
154
+ with gr.Row():
155
+ precision_output = gr.Label()
156
+ with gr.Row():
157
+ recall_output = gr.Label()
158
+ with gr.Row():
159
+ f1_output = gr.Label()
160
+ with gr.Tab('Feature Importances'):
161
+ fimp_output = gr.Plot()
162
+ with gr.Tab('Confusion Matrix'):
163
+ cfm_output = gr.Plot()
164
+ predict_button.click(fn=predict_credit_worthiness,
165
+ inputs=[name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22],
166
+ outputs=[prediction_output,precision_output, recall_output, f1_output, fimp_output, cfm_output])
167
+ gr.Markdown('''
168
+ Want to work in a project together or have interest in my services? Reach me:
169
+ [Linkedin](https://www.linkedin.com/in/marcilioduarte98/)
170
+ [Github](https://github.com/marcilioduarte)
171
+ @marcilioduarte | Economics and Data Science
172
+ ''')
173
+ demo.launch()
data/processed/x_test.parquet ADDED
Binary file (16.7 kB). View file
 
data/processed/x_train.parquet ADDED
Binary file (18 kB). View file
 
data/processed/y_test.parquet ADDED
Binary file (1.26 kB). View file
 
data/processed/y_train.parquet ADDED
Binary file (1.32 kB). View file
 
data/processed/yhat.parquet ADDED
Binary file (1.29 kB). View file
 
data/raw/german_credit.csv ADDED
@@ -0,0 +1,1001 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Creditability,Account Balance,Duration of Credit (month),Payment Status of Previous Credit,Purpose,Credit Amount,Value Savings/Stocks,Length of current employment,Instalment per cent,Sex & Marital Status,Guarantors,Duration in Current address,Most valuable available asset,Age (years),Concurrent Credits,Type of apartment,No of Credits at this Bank,Occupation,No of dependents,Telephone,Foreign Worker
2
+ 1,1,18,4,2,1049,1,2,4,2,1,4,2,21,3,1,1,3,1,1,1
3
+ 1,1,9,4,0,2799,1,3,2,3,1,2,1,36,3,1,2,3,2,1,1
4
+ 1,2,12,2,9,841,2,4,2,2,1,4,1,23,3,1,1,2,1,1,1
5
+ 1,1,12,4,0,2122,1,3,3,3,1,2,1,39,3,1,2,2,2,1,2
6
+ 1,1,12,4,0,2171,1,3,4,3,1,4,2,38,1,2,2,2,1,1,2
7
+ 1,1,10,4,0,2241,1,2,1,3,1,3,1,48,3,1,2,2,2,1,2
8
+ 1,1,8,4,0,3398,1,4,1,3,1,4,1,39,3,2,2,2,1,1,2
9
+ 1,1,6,4,0,1361,1,2,2,3,1,4,1,40,3,2,1,2,2,1,2
10
+ 1,4,18,4,3,1098,1,1,4,2,1,4,3,65,3,2,2,1,1,1,1
11
+ 1,2,24,2,3,3758,3,1,1,2,1,4,4,23,3,1,1,1,1,1,1
12
+ 1,1,11,4,0,3905,1,3,2,3,1,2,1,36,3,1,2,3,2,1,1
13
+ 1,1,30,4,1,6187,2,4,1,4,1,4,3,24,3,1,2,3,1,1,1
14
+ 1,1,6,4,3,1957,1,4,1,2,1,4,3,31,3,2,1,3,1,1,1
15
+ 1,2,48,3,10,7582,2,1,2,3,1,4,4,31,3,2,1,4,1,2,1
16
+ 1,1,18,2,3,1936,5,4,2,4,1,4,3,23,3,1,2,2,1,1,1
17
+ 1,1,6,2,3,2647,3,3,2,3,1,3,1,44,3,1,1,3,2,1,1
18
+ 1,1,11,4,0,3939,1,3,1,3,1,2,1,40,3,2,2,2,2,1,1
19
+ 1,2,18,2,3,3213,3,2,1,4,1,3,1,25,3,1,1,3,1,1,1
20
+ 1,2,36,4,3,2337,1,5,4,3,1,4,1,36,3,2,1,3,1,1,1
21
+ 1,4,11,4,0,7228,1,3,1,3,1,4,2,39,3,2,2,2,1,1,1
22
+ 1,1,6,4,0,3676,1,3,1,3,1,3,1,37,3,1,3,3,2,1,1
23
+ 1,2,12,4,0,3124,1,2,1,3,1,3,1,49,1,2,2,2,2,1,1
24
+ 0,2,36,2,5,2384,1,2,4,3,1,1,4,33,3,1,1,2,1,1,1
25
+ 1,2,12,4,4,1424,1,4,4,3,1,3,2,26,3,2,1,3,1,1,1
26
+ 1,1,6,4,0,4716,5,2,1,3,1,3,1,44,3,2,2,2,2,1,1
27
+ 1,2,11,3,3,4771,1,4,2,3,1,4,2,51,3,2,1,3,1,1,1
28
+ 1,1,12,2,2,652,1,5,4,2,1,4,2,24,3,1,1,3,1,1,1
29
+ 1,2,9,4,3,1154,1,5,2,3,1,4,1,37,3,2,3,2,1,1,1
30
+ 1,4,15,2,0,3556,5,3,3,3,1,2,4,29,3,2,1,3,1,1,1
31
+ 1,3,42,4,1,4796,1,5,4,3,1,4,4,56,3,3,1,3,1,1,1
32
+ 1,3,30,4,3,3017,1,5,4,3,1,4,2,47,3,2,1,3,1,1,1
33
+ 1,4,36,4,0,3535,1,4,4,3,1,4,3,37,3,2,2,3,1,2,1
34
+ 1,4,36,4,0,6614,1,5,4,3,1,4,3,34,3,2,2,4,1,2,1
35
+ 1,4,24,2,3,1376,3,4,4,2,1,1,3,28,3,2,1,3,1,1,1
36
+ 1,1,15,2,0,1721,1,2,2,3,1,3,1,36,3,2,1,3,1,1,1
37
+ 1,1,6,4,0,860,1,5,1,2,1,4,4,39,3,2,2,3,1,2,1
38
+ 1,4,12,4,0,1495,1,5,4,3,1,1,1,38,3,2,2,2,2,1,1
39
+ 1,4,12,4,3,1934,1,5,2,3,1,2,4,26,3,2,2,3,1,1,1
40
+ 1,4,18,2,1,3378,5,3,2,3,1,1,2,31,3,2,1,3,1,2,1
41
+ 1,4,24,4,1,3868,1,5,4,2,1,2,3,41,3,1,2,4,1,2,1
42
+ 1,4,12,4,5,996,5,4,4,2,1,4,1,23,3,2,2,3,1,1,1
43
+ 1,1,24,2,10,1755,1,5,4,2,3,4,1,58,3,2,1,2,1,2,1
44
+ 1,4,18,4,0,1028,1,3,4,2,1,3,1,36,3,2,2,3,1,1,1
45
+ 1,2,24,4,9,2825,5,4,4,3,1,3,4,34,3,2,2,3,2,2,1
46
+ 1,2,18,2,6,1239,5,3,4,3,1,4,4,61,3,3,1,3,1,1,1
47
+ 0,1,18,2,0,1216,1,2,4,2,1,3,3,23,3,1,1,3,1,2,1
48
+ 1,4,24,2,9,1258,1,4,4,3,1,1,1,25,3,2,1,3,1,2,1
49
+ 0,4,18,4,6,1864,2,3,4,2,1,2,1,30,3,2,2,3,1,1,1
50
+ 1,4,24,2,0,1474,2,2,4,4,1,3,1,33,3,2,1,3,1,2,1
51
+ 1,1,24,4,9,1382,2,4,4,3,1,1,1,26,3,2,2,3,1,2,1
52
+ 1,4,12,2,0,640,1,3,4,1,1,2,1,49,3,2,1,2,1,1,1
53
+ 1,3,36,2,3,3919,1,3,2,3,1,2,1,23,3,2,1,3,1,2,1
54
+ 1,4,9,4,0,1224,1,3,3,3,1,1,1,30,3,2,2,3,1,1,1
55
+ 1,4,12,4,3,2331,5,5,1,3,2,4,1,49,3,2,1,3,1,2,1
56
+ 1,4,24,2,1,6313,5,5,3,3,1,4,3,41,3,2,1,4,2,2,1
57
+ 1,1,12,4,3,385,1,4,4,2,1,3,1,58,3,2,4,2,1,2,1
58
+ 1,4,12,4,3,1655,1,5,2,3,1,4,1,63,3,2,2,2,1,2,1
59
+ 1,1,15,2,3,1053,1,2,4,4,1,2,1,27,3,2,1,3,1,1,2
60
+ 1,4,21,2,3,3160,5,5,4,3,1,3,2,41,3,2,1,3,1,2,1
61
+ 1,4,36,2,0,3079,5,3,4,3,1,4,1,36,3,2,1,3,1,1,1
62
+ 1,4,12,4,0,1163,3,3,4,3,1,4,1,44,3,2,1,3,1,2,1
63
+ 1,4,24,2,1,2679,1,2,4,2,1,1,4,29,3,2,1,4,1,2,1
64
+ 1,4,48,4,3,3578,5,5,4,3,1,1,1,47,3,2,1,3,1,2,1
65
+ 1,4,36,3,0,10875,1,5,2,3,1,2,3,45,3,2,2,3,2,2,1
66
+ 1,1,12,3,0,1344,1,3,4,3,1,2,1,43,3,2,2,2,2,1,1
67
+ 1,4,6,4,3,1237,2,3,1,2,1,1,2,27,3,2,2,3,1,1,1
68
+ 1,4,12,2,3,3077,1,3,2,3,1,4,3,52,3,2,1,3,1,2,1
69
+ 1,4,24,2,3,2284,1,4,4,3,1,2,3,28,3,2,1,3,1,2,1
70
+ 1,2,12,2,3,1567,1,3,1,2,1,1,3,22,3,2,1,3,1,2,1
71
+ 1,4,24,3,0,2032,1,5,4,3,1,4,4,60,3,3,2,3,1,2,1
72
+ 1,2,21,4,2,2745,4,4,3,3,1,2,3,32,3,2,2,3,1,2,1
73
+ 1,4,30,2,3,1867,5,5,4,3,1,4,3,58,3,2,1,3,1,2,1
74
+ 1,4,36,2,3,2299,3,5,4,3,1,4,3,39,3,2,1,3,1,1,1
75
+ 1,4,24,2,2,929,5,4,4,3,1,2,3,31,2,2,1,3,1,2,1
76
+ 1,3,12,2,3,3399,5,5,2,3,1,3,3,37,3,2,1,4,1,1,1
77
+ 1,2,9,2,2,2030,5,4,2,3,1,1,3,24,3,2,1,3,1,2,1
78
+ 1,4,21,4,1,3275,1,5,1,3,1,4,3,36,3,2,1,4,1,2,1
79
+ 1,4,24,4,0,1940,4,5,4,3,1,4,1,60,3,2,1,3,1,2,1
80
+ 1,1,21,4,0,1602,1,5,4,4,1,3,3,30,3,2,2,3,1,2,1
81
+ 1,4,15,2,3,1979,5,5,4,3,1,2,3,35,3,2,1,3,1,1,1
82
+ 1,4,24,4,0,2022,1,3,4,2,1,4,3,37,3,2,1,3,1,2,1
83
+ 1,4,36,4,3,3342,5,5,4,3,1,2,3,51,3,2,1,3,1,2,1
84
+ 1,2,18,2,0,5866,2,3,2,3,1,2,3,30,3,2,2,3,1,2,1
85
+ 1,3,15,4,1,2360,3,3,2,3,1,2,3,36,3,2,1,3,1,2,1
86
+ 1,4,15,4,2,1520,5,5,4,3,1,4,2,63,3,2,1,3,1,1,1
87
+ 1,1,12,2,0,3651,4,3,1,3,1,3,2,31,3,2,1,3,2,1,1
88
+ 1,4,24,4,1,2346,1,4,4,3,1,3,3,35,3,2,2,3,1,2,1
89
+ 1,4,36,3,3,4454,1,3,4,2,1,4,1,34,3,2,2,3,1,1,1
90
+ 1,1,6,4,0,666,4,4,3,2,1,4,1,39,3,2,2,2,1,2,1
91
+ 1,2,24,3,0,1965,5,3,4,2,1,4,3,42,3,1,2,3,1,2,1
92
+ 1,2,12,4,0,1995,2,2,4,3,1,1,3,27,3,2,1,3,1,1,1
93
+ 1,2,30,2,3,2991,5,5,2,2,1,4,3,25,3,2,1,3,1,1,1
94
+ 1,2,30,0,9,4221,1,3,2,2,1,1,3,28,3,2,2,3,1,1,1
95
+ 1,1,9,2,3,1364,1,4,3,3,1,4,1,59,3,2,1,3,1,1,1
96
+ 1,2,18,4,2,6361,1,5,2,3,1,1,4,41,3,2,1,3,1,2,1
97
+ 1,4,27,4,2,4526,4,2,4,3,1,2,1,32,2,2,2,2,2,2,1
98
+ 1,2,12,4,3,3573,1,3,1,2,1,1,1,23,3,2,1,2,1,1,1
99
+ 0,2,36,3,9,4455,1,3,2,1,1,2,1,30,2,2,2,4,1,2,1
100
+ 1,1,9,2,2,2136,1,3,3,3,1,2,1,25,3,2,1,3,1,1,1
101
+ 1,2,42,4,9,5954,1,4,2,2,1,1,1,41,1,2,2,2,1,1,1
102
+ 1,4,24,4,2,3777,4,3,4,3,1,4,1,40,3,2,1,3,1,2,1
103
+ 1,1,15,2,9,806,1,3,4,2,1,4,2,22,3,2,1,2,1,1,1
104
+ 1,2,24,3,9,4712,5,3,4,3,1,2,2,34,1,2,2,4,1,2,1
105
+ 1,2,36,3,0,7432,1,3,2,2,1,2,2,54,3,1,1,3,1,1,1
106
+ 1,4,24,4,3,1851,1,4,4,4,3,2,3,33,3,2,2,3,1,2,1
107
+ 1,4,24,2,0,1393,1,3,2,3,3,2,1,31,3,2,1,3,1,2,1
108
+ 1,4,12,4,9,1412,1,3,4,2,3,2,1,29,3,2,2,4,1,2,1
109
+ 1,4,18,2,3,1473,1,2,3,4,1,4,1,39,3,2,1,3,1,2,1
110
+ 1,4,24,2,3,1533,1,2,4,2,1,3,3,38,2,2,1,3,1,2,1
111
+ 1,4,12,4,6,2012,5,4,4,2,1,2,3,61,3,2,1,3,1,1,1
112
+ 0,1,15,2,0,3959,1,3,3,2,1,2,2,29,3,2,1,3,1,2,1
113
+ 1,1,6,2,2,428,1,5,2,2,1,1,2,49,1,2,1,3,1,2,1
114
+ 1,2,12,4,0,2366,3,4,3,1,1,3,3,36,3,2,1,4,1,2,1
115
+ 1,4,12,2,2,763,1,3,4,2,1,1,1,26,3,2,1,3,1,2,1
116
+ 1,2,21,2,2,3976,5,4,2,3,1,3,3,35,3,2,1,3,1,2,1
117
+ 1,2,18,2,0,6260,1,4,3,3,1,3,1,28,3,1,1,2,1,1,1
118
+ 1,2,9,4,2,1919,1,4,4,3,1,3,3,35,3,1,1,3,1,2,1
119
+ 1,4,24,2,1,2603,4,3,2,2,1,4,3,28,3,1,1,3,1,2,1
120
+ 1,4,9,4,6,936,3,5,4,3,1,2,3,52,3,2,2,3,1,2,1
121
+ 1,4,24,2,2,3062,3,5,4,3,1,3,4,32,3,1,1,3,1,2,1
122
+ 1,2,36,2,3,4795,1,2,4,2,1,1,4,30,3,2,1,4,1,2,1
123
+ 1,4,36,4,1,5842,1,5,2,3,1,2,2,35,3,2,2,3,2,2,1
124
+ 1,2,6,2,3,2063,1,2,4,4,1,3,3,30,3,1,1,4,1,2,1
125
+ 1,4,15,4,3,1459,1,3,4,2,1,2,3,43,3,2,1,2,1,1,1
126
+ 1,4,15,2,3,1213,3,5,4,3,1,3,2,47,2,2,1,3,1,2,1
127
+ 1,4,24,4,3,5103,1,2,3,4,1,3,4,47,3,3,3,3,1,2,1
128
+ 1,4,15,2,4,874,5,2,4,2,1,1,1,24,3,2,1,3,1,1,1
129
+ 1,4,6,2,2,2978,3,3,1,3,1,2,3,32,3,2,1,3,1,2,1
130
+ 1,4,18,2,0,1820,1,3,2,4,1,2,2,30,3,2,1,4,1,2,1
131
+ 1,4,24,4,3,2872,2,5,3,3,1,4,1,36,3,2,1,3,2,2,1
132
+ 1,3,24,2,2,1925,1,3,2,3,1,2,1,26,3,2,1,3,1,1,1
133
+ 1,4,18,2,2,2515,1,3,3,3,1,4,1,43,3,2,1,3,1,2,1
134
+ 1,3,6,2,2,2116,1,3,2,3,1,2,1,41,3,2,1,3,1,2,1
135
+ 1,4,18,2,3,1453,1,2,3,2,1,1,1,26,3,2,1,3,1,1,1
136
+ 1,4,10,2,0,1364,1,3,2,2,1,4,3,64,3,2,1,3,1,2,1
137
+ 1,4,6,2,2,1543,4,3,4,1,1,2,1,33,3,2,1,3,1,1,1
138
+ 1,2,12,2,0,1318,4,5,4,3,1,4,1,54,3,2,1,3,1,2,1
139
+ 1,1,24,1,0,2325,2,4,2,3,1,3,3,32,1,2,1,3,1,1,1
140
+ 1,2,6,4,8,932,5,4,1,2,1,3,2,39,3,2,2,2,1,1,1
141
+ 1,3,24,4,3,3148,5,3,3,3,1,2,3,31,3,2,2,3,1,2,1
142
+ 1,4,36,2,3,3835,5,5,2,2,1,4,1,45,3,2,1,2,1,2,1
143
+ 1,4,9,2,6,3832,5,5,1,3,1,4,1,64,3,2,1,2,1,1,1
144
+ 1,2,24,2,3,5084,5,5,2,2,1,4,3,42,3,2,1,3,1,2,1
145
+ 1,4,9,4,2,2406,1,1,2,3,1,3,3,31,3,2,1,4,1,1,1
146
+ 1,4,36,2,3,2394,5,3,4,2,1,4,3,25,3,2,1,3,1,1,1
147
+ 1,4,21,2,1,2476,5,5,4,3,1,4,1,46,3,2,1,4,1,2,1
148
+ 1,1,24,2,1,2964,5,5,4,3,1,4,4,49,1,3,1,3,2,2,1
149
+ 1,1,12,2,2,1262,5,5,2,1,1,4,2,49,3,2,1,2,1,2,1
150
+ 1,4,12,2,9,1542,1,4,2,3,1,4,3,36,3,2,1,3,1,2,1
151
+ 1,2,24,4,3,1743,1,5,4,3,1,2,2,48,3,2,2,2,1,1,1
152
+ 1,3,12,1,3,409,4,3,3,2,1,3,1,42,3,1,2,3,1,1,1
153
+ 1,4,12,2,3,2171,1,2,2,2,1,2,3,29,1,2,1,3,1,1,1
154
+ 1,4,48,4,1,8858,5,4,2,3,1,1,4,35,3,3,2,3,1,2,1
155
+ 1,2,24,2,0,3512,2,4,2,3,1,3,3,38,1,2,2,3,1,2,1
156
+ 1,2,12,2,3,1158,3,3,3,1,1,1,3,26,3,2,1,3,1,2,1
157
+ 1,4,24,4,3,2684,1,3,4,3,1,2,1,35,3,2,2,2,1,1,1
158
+ 1,1,12,2,3,1498,1,3,4,2,1,1,3,23,1,2,1,3,1,1,1
159
+ 1,4,30,4,3,5954,1,4,3,3,2,2,3,38,3,2,1,3,1,1,1
160
+ 0,2,48,1,9,6416,1,5,4,2,1,3,4,59,3,1,1,3,1,1,1
161
+ 1,2,12,4,2,3617,1,5,1,3,1,4,3,28,3,1,3,3,1,2,1
162
+ 1,4,12,4,3,1291,1,3,4,2,1,2,2,35,3,2,2,3,1,1,1
163
+ 1,3,24,4,9,1275,4,3,2,1,1,4,1,36,3,2,2,3,1,2,1
164
+ 1,4,24,2,2,3972,1,4,2,2,1,4,2,25,3,1,1,3,1,2,1
165
+ 1,4,15,4,2,3343,1,3,4,3,1,2,4,28,3,3,1,3,1,2,1
166
+ 1,3,15,2,6,392,1,2,4,2,1,4,2,23,3,1,1,3,1,2,1
167
+ 1,4,9,4,0,2134,1,3,4,3,1,4,3,48,3,2,3,3,1,2,1
168
+ 1,4,30,4,3,5771,1,4,4,2,1,2,3,25,3,2,2,3,1,1,1
169
+ 1,4,24,4,9,4526,1,3,3,3,1,2,1,74,3,2,1,4,1,2,1
170
+ 1,4,15,4,2,2788,1,4,2,2,2,3,3,24,1,2,2,3,1,1,1
171
+ 1,4,6,4,3,1382,1,3,1,2,1,1,3,28,3,2,2,3,1,2,1
172
+ 1,3,36,2,3,5848,1,3,4,3,1,1,3,24,3,2,1,3,1,1,1
173
+ 0,1,12,2,0,1228,1,3,4,2,1,2,1,24,3,2,1,2,1,1,1
174
+ 1,3,12,2,3,1297,1,3,3,4,1,4,1,23,3,1,1,3,1,1,1
175
+ 1,4,24,2,3,1552,1,4,3,3,1,1,3,32,1,2,1,3,2,1,1
176
+ 1,4,12,2,3,1963,1,4,4,3,1,2,3,31,3,1,2,4,2,2,1
177
+ 1,4,24,2,3,3235,3,5,3,1,1,2,3,36,3,2,1,4,1,2,1
178
+ 1,4,24,4,9,4139,2,3,3,3,1,3,2,27,3,2,2,2,1,2,1
179
+ 1,2,12,4,1,1804,2,2,3,3,1,4,2,44,3,2,1,3,1,1,1
180
+ 1,4,18,2,9,1950,1,4,4,3,1,1,3,34,2,2,2,3,1,2,1
181
+ 1,4,48,3,3,12749,3,4,4,3,1,1,3,37,3,2,1,4,1,2,1
182
+ 1,4,9,2,4,1236,1,2,1,2,1,4,1,23,3,1,1,3,1,2,1
183
+ 1,4,18,4,0,1055,1,2,4,2,1,1,2,30,3,2,2,3,1,1,1
184
+ 1,1,30,0,9,8072,5,2,2,3,1,3,3,25,1,2,3,3,1,1,1
185
+ 1,4,30,4,3,2831,1,3,4,2,1,2,3,33,3,2,1,3,1,2,1
186
+ 1,4,9,2,9,1449,1,4,3,2,1,2,3,27,3,2,2,3,1,1,1
187
+ 1,4,36,2,9,5742,2,4,2,3,1,2,3,31,3,2,2,3,1,2,1
188
+ 1,4,12,2,0,2390,5,5,4,3,1,3,3,50,3,2,1,3,1,2,1
189
+ 1,4,24,2,3,3430,3,5,3,3,1,2,3,31,3,2,1,3,2,2,1
190
+ 1,2,36,2,6,2273,1,4,3,3,1,1,3,32,3,2,2,3,2,1,1
191
+ 1,3,21,2,0,2923,2,3,1,2,1,1,3,28,1,2,1,4,1,2,1
192
+ 1,4,24,2,3,1901,2,3,4,3,1,4,3,29,3,1,1,4,1,2,1
193
+ 1,2,36,2,6,3711,5,3,2,4,1,2,3,27,3,2,1,3,1,1,1
194
+ 1,2,48,2,0,8487,5,4,1,2,1,2,3,24,3,2,1,3,1,1,1
195
+ 1,4,24,2,0,2255,5,2,4,3,1,1,2,54,3,2,1,3,1,1,1
196
+ 1,4,12,2,3,1262,1,3,3,3,1,2,3,25,3,2,1,3,1,1,1
197
+ 1,4,33,4,1,7253,1,4,3,3,1,2,3,35,3,2,2,4,1,2,1
198
+ 1,4,6,4,0,6761,1,4,1,3,1,3,4,45,3,2,2,4,2,2,1
199
+ 1,4,18,4,2,1817,1,3,4,2,1,2,4,28,3,2,2,3,1,1,1
200
+ 1,4,12,2,3,2141,2,4,3,3,1,1,4,35,3,2,1,3,1,1,1
201
+ 1,4,48,1,9,3609,1,3,1,2,1,1,1,27,2,2,1,3,1,1,1
202
+ 1,4,30,2,3,2333,3,5,4,3,1,2,3,30,1,2,1,4,1,1,1
203
+ 1,4,28,1,1,7824,5,2,3,3,3,4,1,40,1,1,2,3,2,2,1
204
+ 1,3,18,1,3,1445,5,4,4,3,1,4,3,49,1,2,1,2,1,1,1
205
+ 1,1,24,2,2,7721,5,2,1,2,1,2,2,30,3,2,1,3,1,2,2
206
+ 1,1,21,2,0,3763,5,4,2,3,2,2,1,24,3,2,1,2,1,1,2
207
+ 1,2,18,2,9,4439,1,5,1,3,2,1,1,33,1,2,1,4,1,2,1
208
+ 1,1,12,2,3,1107,1,3,2,3,1,2,1,20,3,1,1,4,2,2,1
209
+ 1,2,15,2,3,1444,5,2,4,3,1,1,2,23,3,2,1,3,1,1,1
210
+ 1,2,48,1,0,12169,5,1,4,3,2,4,4,36,3,3,1,4,1,2,1
211
+ 1,4,9,2,3,2753,2,5,3,3,2,4,3,35,3,2,1,3,1,2,1
212
+ 1,3,4,2,0,1494,5,2,1,3,1,2,1,29,3,2,1,2,2,1,2
213
+ 1,1,24,1,2,2828,3,3,4,3,1,4,1,22,2,2,1,3,1,2,1
214
+ 1,1,24,1,2,2483,3,3,4,3,1,4,1,22,2,2,1,3,1,2,1
215
+ 1,3,6,4,0,1299,1,3,1,3,1,1,1,74,3,2,3,1,2,1,2
216
+ 1,2,9,2,0,1549,5,2,4,3,1,2,1,35,3,2,1,1,1,1,1
217
+ 1,3,10,2,0,3949,1,2,1,3,3,1,2,37,3,2,1,2,2,1,1
218
+ 1,4,10,2,1,2901,5,2,1,2,1,4,1,31,3,1,1,3,1,1,1
219
+ 1,3,6,2,0,709,4,2,2,4,1,2,1,27,3,2,1,1,1,1,2
220
+ 1,1,47,2,0,10722,1,2,1,2,1,1,1,35,3,2,1,2,1,2,1
221
+ 1,4,10,2,0,1287,5,5,4,3,2,2,2,45,3,2,1,2,1,1,2
222
+ 1,1,18,1,3,1940,1,2,3,3,2,4,4,36,1,3,1,4,1,2,1
223
+ 1,3,30,4,3,3656,5,5,4,3,1,4,2,49,2,2,2,2,1,1,1
224
+ 1,4,24,3,1,4679,1,4,3,3,1,3,3,35,3,2,2,2,1,2,1
225
+ 1,4,27,3,1,8613,4,3,2,3,1,2,3,27,3,2,2,3,1,1,1
226
+ 1,1,18,2,2,2659,4,3,4,3,1,2,3,28,3,2,1,3,1,1,1
227
+ 1,4,24,4,3,1516,4,3,4,2,1,1,1,43,3,2,2,2,1,1,1
228
+ 1,1,18,2,0,4380,2,3,3,3,1,4,3,35,3,2,1,2,2,2,1
229
+ 1,4,14,3,0,802,1,3,4,3,1,2,3,27,3,2,2,2,1,1,1
230
+ 1,4,21,2,9,1572,4,5,4,2,1,4,1,36,1,2,1,2,1,1,1
231
+ 1,2,48,1,9,3566,2,4,4,3,1,2,3,30,3,2,1,3,1,1,1
232
+ 1,4,24,2,3,1278,1,5,4,3,1,1,1,36,3,2,1,4,1,2,1
233
+ 1,4,6,0,3,426,1,5,4,4,1,4,3,39,3,2,1,2,1,1,1
234
+ 1,4,39,2,1,8588,2,5,4,3,1,2,3,45,3,2,1,4,1,2,1
235
+ 1,1,30,2,1,3857,1,3,4,1,1,4,2,40,3,2,1,4,1,2,1
236
+ 0,2,12,2,0,685,1,4,2,4,1,3,3,25,1,2,1,2,1,1,1
237
+ 1,1,24,2,3,1603,1,5,4,2,1,4,3,55,3,2,1,3,1,1,1
238
+ 1,4,21,2,2,2241,1,5,4,3,1,2,1,50,3,2,2,3,1,1,1
239
+ 1,1,24,2,3,2384,1,5,4,3,1,4,1,64,1,1,1,2,1,1,1
240
+ 1,4,4,2,2,601,1,2,1,2,1,3,1,23,3,1,1,2,2,1,1
241
+ 1,4,39,2,1,2569,3,3,4,3,1,4,3,24,3,2,1,3,1,1,1
242
+ 1,4,15,4,3,1316,3,3,2,4,1,2,2,47,3,2,2,2,1,1,1
243
+ 1,4,60,2,0,10366,1,5,2,3,1,4,2,42,3,2,1,4,1,2,1
244
+ 1,4,18,2,9,1568,2,3,3,2,1,4,2,24,3,1,1,2,1,1,1
245
+ 1,4,18,4,3,629,3,5,4,3,1,3,2,32,1,2,2,4,1,2,1
246
+ 1,4,6,1,3,1750,3,5,2,3,1,4,2,45,1,2,1,2,2,1,1
247
+ 1,4,24,2,1,3488,2,4,3,2,1,4,3,23,3,2,1,3,1,1,1
248
+ 1,4,18,4,3,1800,1,3,4,3,1,2,3,24,3,2,2,3,1,1,1
249
+ 1,4,24,3,2,4151,2,3,2,3,1,3,2,35,3,2,2,3,1,1,1
250
+ 1,2,15,2,5,2631,2,3,3,2,1,2,1,25,3,2,1,2,1,1,1
251
+ 1,4,21,2,1,5248,5,3,1,3,1,3,3,26,3,2,1,3,1,1,1
252
+ 1,2,18,3,0,2899,5,5,4,3,1,4,3,43,3,2,1,3,2,1,1
253
+ 1,2,18,3,5,6204,1,3,2,3,1,4,1,44,3,2,1,2,2,2,1
254
+ 1,4,12,2,3,804,1,5,4,3,1,4,3,38,3,2,1,3,1,1,1
255
+ 1,4,36,2,3,3595,1,5,4,3,1,2,3,28,3,2,1,3,1,1,1
256
+ 1,4,36,4,1,5711,4,5,4,3,1,2,3,38,3,2,2,4,1,2,1
257
+ 1,3,15,2,9,2687,1,4,2,3,1,4,2,26,3,1,1,3,1,2,1
258
+ 1,1,15,3,2,3643,1,5,1,2,1,4,2,27,3,2,2,2,1,1,1
259
+ 1,4,10,4,2,2146,1,2,1,2,1,3,1,23,3,1,2,3,1,1,1
260
+ 1,1,10,2,3,2315,1,5,3,3,1,4,1,52,3,2,1,2,1,1,1
261
+ 1,4,5,2,9,3448,1,4,1,3,1,4,1,74,3,2,1,2,1,1,1
262
+ 1,4,15,2,2,2708,1,2,2,3,1,3,2,27,1,2,2,2,1,1,1
263
+ 1,4,11,4,0,1393,1,2,4,2,1,4,3,35,3,2,2,4,1,1,1
264
+ 1,3,10,2,2,1275,1,2,4,2,1,2,2,23,3,2,1,3,1,1,1
265
+ 1,4,9,2,2,1313,1,5,1,3,1,4,3,20,3,2,1,3,1,1,1
266
+ 1,4,12,2,3,1493,1,2,4,2,1,3,3,34,3,2,1,3,2,1,1
267
+ 1,4,22,2,3,2675,3,5,3,3,1,4,3,40,3,2,1,3,1,1,1
268
+ 1,2,9,2,3,2118,1,3,2,3,1,2,1,37,3,2,1,2,2,1,1
269
+ 1,4,36,2,0,909,3,5,4,3,1,4,2,36,3,2,1,3,1,1,1
270
+ 1,4,12,4,2,1258,1,2,2,2,1,4,2,22,3,1,2,2,1,1,1
271
+ 1,4,15,1,3,1569,2,5,4,3,1,4,3,34,1,2,1,2,2,1,1
272
+ 1,4,6,2,1,1236,3,3,2,3,1,4,2,50,3,1,1,3,1,1,1
273
+ 1,4,36,3,2,7678,3,4,2,2,1,4,3,40,3,2,2,3,1,2,1
274
+ 1,4,6,2,5,660,3,4,2,4,1,4,1,23,3,1,1,2,1,1,1
275
+ 1,4,24,2,2,2835,3,5,3,3,1,4,2,53,3,2,1,3,1,1,1
276
+ 1,4,24,2,1,2670,1,5,4,3,1,4,3,35,3,2,1,4,1,2,1
277
+ 1,4,12,1,8,3447,3,3,4,2,1,3,1,35,3,2,1,2,2,1,1
278
+ 1,4,15,2,3,3568,1,5,4,2,1,2,3,54,1,1,1,4,1,2,1
279
+ 1,2,21,4,9,3652,1,4,2,3,1,3,2,27,3,2,2,3,1,1,1
280
+ 1,1,24,2,3,3660,1,3,2,2,1,4,3,28,3,2,1,3,1,1,1
281
+ 1,3,9,2,3,1126,2,5,2,1,1,4,1,49,3,2,1,3,1,1,1
282
+ 1,3,6,3,3,683,1,2,2,2,1,1,2,29,1,2,1,3,1,1,1
283
+ 1,3,12,2,2,2251,1,3,1,2,1,2,3,46,3,2,1,2,1,1,1
284
+ 1,4,12,2,1,4675,5,2,1,2,1,4,3,20,3,1,1,3,1,1,1
285
+ 1,2,21,3,0,2353,1,3,1,1,1,4,2,47,3,2,2,3,1,1,1
286
+ 1,1,21,2,3,3357,4,2,4,2,1,2,3,29,1,2,1,3,1,1,1
287
+ 1,4,6,2,0,672,1,1,1,2,1,4,1,54,3,2,1,1,1,2,1
288
+ 1,1,6,4,3,338,3,5,4,3,1,4,3,52,3,2,2,3,1,1,1
289
+ 1,4,9,2,3,2697,1,3,1,3,1,2,1,32,3,2,1,3,2,1,1
290
+ 1,4,9,2,0,2507,3,5,2,3,1,4,4,51,3,3,1,2,1,1,1
291
+ 1,4,15,3,3,1478,1,3,4,4,1,3,1,33,1,2,2,3,1,1,1
292
+ 1,4,12,4,6,3565,5,2,2,3,1,1,2,37,3,2,2,2,2,1,1
293
+ 1,4,15,2,2,2221,3,3,2,2,1,4,3,20,3,1,1,3,1,1,1
294
+ 1,4,6,4,3,1898,5,3,1,3,1,2,1,34,3,2,2,2,2,1,1
295
+ 1,2,6,3,9,1449,2,5,1,1,1,2,3,31,1,2,2,3,2,1,1
296
+ 1,4,15,3,2,960,4,4,3,2,1,2,2,30,3,2,2,3,1,1,1
297
+ 1,4,36,2,1,8133,1,3,1,2,1,2,2,30,1,2,1,3,1,1,1
298
+ 1,4,9,2,2,2301,2,2,2,2,1,4,2,22,3,1,1,3,1,1,1
299
+ 1,4,6,3,9,1743,2,3,1,3,1,2,1,34,3,2,2,2,1,1,1
300
+ 1,2,12,2,2,983,4,2,1,2,1,4,1,19,3,1,1,2,1,1,1
301
+ 1,4,18,3,3,2320,1,1,2,4,1,3,1,34,3,2,2,3,1,1,1
302
+ 1,1,12,1,8,339,1,5,4,4,1,1,3,45,1,2,1,2,1,1,1
303
+ 1,3,24,2,3,5152,1,4,4,3,1,2,3,25,1,2,1,3,1,1,1
304
+ 1,3,24,2,2,3749,1,2,2,2,1,4,3,26,3,2,1,3,1,1,1
305
+ 1,4,9,4,3,3074,5,3,1,3,1,2,1,33,3,2,2,3,2,1,1
306
+ 0,3,9,2,3,745,1,3,3,2,1,2,1,28,3,2,1,2,1,1,1
307
+ 1,4,24,2,0,1469,2,5,4,4,1,4,1,41,3,1,1,2,1,1,1
308
+ 1,1,6,2,2,1374,1,3,1,3,1,2,1,36,1,2,1,2,1,2,1
309
+ 1,4,6,1,0,783,5,3,1,3,3,2,1,26,2,2,1,2,2,1,1
310
+ 1,1,21,2,3,2606,1,2,4,2,1,4,2,28,3,1,1,4,1,2,1
311
+ 1,4,54,0,1,9436,5,3,2,3,1,2,2,39,3,2,1,2,2,1,1
312
+ 1,4,12,4,3,930,5,5,4,3,1,4,1,65,3,2,4,3,1,1,1
313
+ 1,4,48,4,1,2751,5,5,4,3,1,3,3,38,3,2,2,3,2,2,1
314
+ 1,4,6,4,0,250,4,3,2,2,1,2,1,41,1,2,2,2,1,1,1
315
+ 1,2,24,2,0,1201,1,2,4,3,1,1,2,26,3,2,1,3,1,1,1
316
+ 1,1,6,2,0,662,1,2,3,3,1,4,1,41,3,2,1,2,2,2,1
317
+ 1,4,15,2,1,1300,5,5,4,3,1,4,4,45,1,3,1,3,2,1,1
318
+ 1,4,24,1,9,1559,1,4,4,3,1,4,3,40,1,2,1,3,1,2,1
319
+ 1,3,12,2,3,3016,1,3,3,4,1,1,3,24,3,2,1,3,1,1,1
320
+ 1,4,15,4,3,1360,1,3,4,3,1,2,2,31,3,2,2,3,1,1,1
321
+ 1,4,6,0,0,1204,2,3,4,3,1,1,4,35,1,1,1,3,1,1,2
322
+ 1,4,10,2,0,1597,3,3,3,3,1,2,4,40,3,1,1,2,2,1,2
323
+ 1,4,12,2,3,2073,2,3,4,2,2,2,1,28,3,2,1,3,1,1,1
324
+ 1,4,11,2,9,2142,4,5,1,1,1,2,1,28,3,2,1,3,1,2,1
325
+ 1,1,10,4,2,2132,5,2,2,2,2,3,1,27,3,1,2,3,1,1,2
326
+ 1,4,10,2,0,1546,1,3,3,3,1,2,1,31,3,2,1,2,2,1,2
327
+ 1,4,24,4,0,1287,4,5,4,2,1,4,1,37,3,2,2,3,1,2,1
328
+ 1,4,10,2,0,1418,2,3,3,3,1,2,1,35,3,1,1,2,1,1,2
329
+ 1,3,6,4,0,1343,1,5,1,3,1,4,1,46,3,2,2,3,2,1,2
330
+ 1,4,18,2,0,2662,5,4,4,3,1,3,2,32,3,2,1,3,1,1,2
331
+ 1,4,18,4,3,6070,1,5,3,3,1,4,3,33,3,2,2,3,1,2,1
332
+ 1,4,24,4,6,1927,5,3,3,2,1,2,3,33,3,2,2,3,1,2,1
333
+ 1,4,18,4,3,2404,1,3,2,2,1,2,3,26,3,2,2,3,1,1,1
334
+ 1,4,6,4,3,1554,1,4,1,2,1,2,3,24,3,1,2,3,1,2,1
335
+ 1,4,22,2,0,1283,5,4,4,2,1,4,2,25,3,1,1,3,1,1,1
336
+ 1,4,24,3,0,717,5,5,4,4,1,4,3,54,3,2,2,3,1,2,1
337
+ 1,1,24,2,2,1747,1,2,4,3,2,1,2,24,3,2,1,2,1,1,2
338
+ 1,1,9,4,5,1288,2,5,3,3,3,4,1,48,3,2,2,3,2,1,2
339
+ 1,1,10,4,0,1038,1,4,4,3,2,3,2,49,3,2,2,3,1,2,1
340
+ 1,4,10,2,1,2848,2,3,1,3,2,2,1,32,3,2,1,3,2,1,1
341
+ 1,4,12,2,1,1413,4,4,3,3,1,2,2,55,3,2,1,3,1,1,2
342
+ 1,4,30,4,3,3077,5,5,3,3,1,2,3,40,3,2,2,3,2,2,1
343
+ 1,1,24,1,1,3632,1,3,1,2,3,4,3,22,1,1,1,3,1,1,2
344
+ 1,4,18,4,1,3229,5,1,2,3,1,4,4,38,3,2,1,4,1,2,1
345
+ 1,4,9,2,0,3577,2,3,1,3,3,2,1,26,3,1,1,3,2,1,2
346
+ 1,4,12,4,0,682,2,4,4,2,1,3,3,51,3,2,2,3,1,2,1
347
+ 1,4,10,2,3,1924,1,3,1,3,1,4,2,38,3,2,1,3,1,2,2
348
+ 1,4,10,2,6,727,3,5,4,3,1,4,4,46,3,3,1,3,1,2,1
349
+ 1,3,10,4,0,781,1,5,4,3,1,4,4,63,3,3,2,3,1,2,1
350
+ 1,1,12,4,0,2121,1,3,4,3,1,2,2,30,3,2,2,3,1,1,1
351
+ 1,4,12,4,6,701,1,3,4,3,1,2,3,32,3,2,2,3,1,1,1
352
+ 1,4,10,4,2,2069,5,3,2,4,1,1,3,26,3,2,2,3,1,1,2
353
+ 1,4,24,2,0,1525,4,4,4,2,1,3,3,34,3,2,1,3,2,2,1
354
+ 1,4,48,4,9,7629,5,5,4,1,1,2,3,46,1,2,2,4,2,1,1
355
+ 0,1,12,4,0,3499,1,3,3,2,2,2,1,29,3,2,2,3,1,1,1
356
+ 1,4,6,2,3,1346,2,5,2,3,1,4,4,42,1,3,1,3,2,2,1
357
+ 1,4,36,4,1,10477,5,5,2,3,1,4,4,42,3,3,2,3,1,1,1
358
+ 1,1,24,2,1,2924,1,3,3,3,3,4,4,63,1,2,1,3,2,2,1
359
+ 1,4,10,4,0,1231,1,5,3,3,1,4,1,32,3,2,2,2,2,1,2
360
+ 1,3,18,2,0,1961,1,5,3,2,1,2,3,23,3,2,1,4,1,1,1
361
+ 1,4,15,4,0,5045,5,5,1,2,1,4,3,59,3,2,1,3,1,2,1
362
+ 1,4,12,4,0,1255,1,5,4,3,1,4,1,61,3,2,2,2,1,1,1
363
+ 1,1,12,2,2,1858,1,2,4,2,1,1,3,22,3,1,1,3,1,1,1
364
+ 1,4,6,4,2,1221,5,3,1,4,1,2,2,27,3,2,2,3,1,1,1
365
+ 1,4,9,2,2,1388,1,3,4,2,1,2,1,26,3,1,1,3,1,1,1
366
+ 1,4,12,2,3,2279,5,3,4,3,1,4,4,37,3,3,1,3,1,2,1
367
+ 1,4,12,0,2,2759,1,5,2,3,1,4,2,34,3,2,2,3,1,1,1
368
+ 1,3,24,2,3,1258,3,3,3,2,1,3,3,57,3,2,1,2,1,1,1
369
+ 1,2,12,0,8,1410,1,3,2,3,1,2,1,31,3,2,1,2,1,2,1
370
+ 1,1,15,2,0,1403,1,3,2,2,1,4,3,28,3,1,1,3,1,1,1
371
+ 1,1,24,2,2,3021,1,3,2,1,1,2,1,24,3,1,1,2,1,1,1
372
+ 1,1,24,2,9,6568,1,3,2,4,1,2,3,21,2,2,1,2,1,1,1
373
+ 1,4,24,4,3,2578,4,5,2,3,1,2,3,34,3,2,1,3,1,1,1
374
+ 1,2,24,4,1,7758,4,5,2,2,1,4,4,29,3,1,1,3,1,1,1
375
+ 1,1,6,2,4,343,1,2,4,2,1,1,1,27,3,2,1,3,1,1,1
376
+ 1,4,21,3,2,1591,2,4,4,3,1,3,1,34,3,2,2,4,1,1,1
377
+ 1,1,27,2,3,3416,1,3,3,3,1,2,3,27,3,2,1,4,1,1,1
378
+ 0,1,12,0,5,1108,1,4,4,3,1,3,1,28,3,2,2,3,1,1,1
379
+ 1,2,27,3,1,5965,1,5,1,3,1,2,3,30,3,2,2,4,1,2,1
380
+ 1,2,15,2,5,1514,2,3,4,3,3,2,1,22,3,2,1,3,1,1,1
381
+ 1,4,30,4,3,6742,5,4,2,3,1,3,2,36,3,2,2,3,1,1,1
382
+ 1,1,18,2,2,3650,1,2,1,2,1,4,3,22,3,1,1,3,1,1,1
383
+ 1,1,21,2,2,3599,1,4,1,2,1,4,3,26,3,1,1,2,1,1,1
384
+ 1,4,60,4,0,13756,5,5,2,3,1,4,4,63,1,3,1,4,1,2,1
385
+ 1,2,9,2,0,276,1,3,4,4,1,4,1,22,3,1,1,2,1,1,1
386
+ 1,4,42,4,2,4041,3,3,4,3,1,4,1,36,3,2,2,3,1,2,1
387
+ 1,2,9,2,3,458,1,3,4,3,1,3,1,24,3,2,1,3,1,1,1
388
+ 0,2,9,2,2,918,1,3,4,2,1,1,2,30,3,2,1,3,1,1,1
389
+ 1,4,24,2,0,7393,1,3,1,3,1,4,2,43,3,2,1,2,2,1,1
390
+ 1,3,10,2,4,1225,1,3,2,3,1,2,3,37,3,2,1,3,1,2,1
391
+ 1,1,24,2,1,2812,5,5,2,2,1,4,1,26,3,1,1,3,1,1,1
392
+ 1,4,15,2,1,3029,1,4,2,3,1,2,3,33,3,2,1,3,1,1,1
393
+ 1,3,12,4,0,1480,3,1,2,3,1,4,4,66,1,3,3,1,1,1,1
394
+ 1,3,6,4,6,1047,1,3,2,2,1,4,2,50,3,2,1,2,1,1,1
395
+ 1,4,15,4,3,1471,1,3,4,3,1,4,4,35,3,3,2,3,1,2,1
396
+ 1,4,24,2,2,5511,2,3,4,3,1,1,3,25,2,2,1,3,1,1,1
397
+ 1,2,9,2,3,1206,1,5,4,2,1,4,1,25,3,2,1,3,1,1,1
398
+ 1,2,24,3,3,6403,1,2,1,3,1,2,3,33,3,2,1,3,1,1,1
399
+ 1,4,12,2,3,707,1,3,4,3,1,2,1,30,1,2,2,3,1,1,1
400
+ 1,4,12,3,1,1503,1,3,4,4,1,4,1,41,3,1,1,3,1,1,1
401
+ 1,2,12,2,0,6078,1,4,2,3,1,2,3,32,3,2,1,3,1,1,1
402
+ 1,2,27,2,9,2528,1,2,4,2,1,1,2,32,3,2,1,3,2,2,1
403
+ 1,2,12,2,9,1037,2,4,3,3,1,4,1,39,3,2,1,2,1,1,1
404
+ 1,1,6,2,1,1352,3,1,1,2,1,2,2,23,3,1,1,1,1,2,1
405
+ 1,4,24,2,3,3181,1,2,4,2,1,4,2,26,3,2,1,3,1,2,1
406
+ 1,4,18,2,3,4594,1,2,3,3,1,2,3,32,3,2,1,3,1,2,1
407
+ 1,2,48,2,10,5381,5,1,3,3,1,4,4,40,1,3,1,1,1,2,1
408
+ 1,4,15,2,1,4657,1,3,3,3,1,2,3,30,3,2,1,3,1,2,1
409
+ 1,2,9,2,9,1391,1,3,2,4,1,1,1,27,1,2,1,3,1,2,1
410
+ 1,2,18,2,9,1913,4,2,3,4,1,3,1,36,1,2,1,3,1,2,1
411
+ 1,4,42,2,3,7166,5,4,2,4,1,4,2,29,3,1,1,3,1,2,1
412
+ 1,4,13,2,3,1409,2,1,2,2,1,4,1,64,3,2,1,3,1,1,1
413
+ 1,4,24,3,9,2978,5,3,4,3,1,4,1,32,3,2,2,3,2,2,1
414
+ 1,4,12,4,3,976,5,5,4,3,1,4,3,35,3,2,2,3,1,1,1
415
+ 1,4,24,3,9,2375,3,3,4,3,1,2,3,44,3,2,2,3,2,2,1
416
+ 1,4,12,4,3,522,3,5,4,3,1,4,2,42,3,2,2,3,2,2,1
417
+ 1,4,28,4,3,2743,1,5,4,3,1,2,3,29,3,2,2,3,1,1,1
418
+ 1,4,11,4,3,1154,2,1,4,2,1,4,1,57,3,2,3,2,1,1,1
419
+ 1,4,24,4,1,5804,4,3,4,3,1,2,1,27,3,2,2,3,1,1,1
420
+ 1,4,18,4,3,1169,5,3,4,3,1,3,2,29,3,2,2,3,1,2,1
421
+ 1,1,15,4,2,1478,1,5,4,3,1,4,3,44,3,2,2,3,2,2,1
422
+ 1,4,12,2,3,776,1,3,4,4,1,2,1,28,3,2,1,3,1,1,1
423
+ 1,2,11,4,0,1322,4,3,4,2,1,4,3,40,3,2,2,3,1,1,1
424
+ 1,2,16,4,0,1175,1,1,2,3,1,3,3,68,3,3,3,1,1,2,1
425
+ 1,4,12,2,0,2133,5,5,4,2,1,4,4,52,3,3,1,4,1,2,1
426
+ 1,4,15,4,3,1829,1,5,4,3,1,4,3,46,3,2,2,3,1,2,1
427
+ 1,4,12,4,3,717,1,5,4,3,1,4,1,52,3,2,3,3,1,1,1
428
+ 1,2,39,3,6,11760,2,4,2,3,1,3,4,32,3,1,1,3,1,2,1
429
+ 0,2,9,4,6,1501,1,5,2,2,1,3,3,34,3,2,2,4,1,2,1
430
+ 1,1,12,2,6,1200,5,3,4,2,1,4,2,23,1,1,1,3,1,2,1
431
+ 1,2,9,2,0,3195,5,3,1,2,1,2,1,33,3,2,1,2,1,1,1
432
+ 1,4,30,4,3,4530,1,4,4,2,1,4,3,26,3,1,1,4,1,2,1
433
+ 0,4,12,3,5,1555,4,5,4,3,1,4,4,55,3,3,2,3,2,1,1
434
+ 1,2,15,4,9,2326,3,3,2,3,1,4,3,27,1,2,1,3,1,1,1
435
+ 1,2,18,4,9,1887,5,3,4,4,1,4,1,28,1,2,2,3,1,1,1
436
+ 1,4,12,4,9,1264,5,5,4,3,1,4,4,57,3,1,1,2,1,1,1
437
+ 1,4,7,3,3,846,5,5,3,3,1,4,4,36,3,3,1,3,1,1,1
438
+ 1,4,15,4,6,1532,2,3,4,2,1,3,3,31,3,2,1,3,1,1,1
439
+ 1,4,6,3,3,935,1,3,3,2,1,2,1,24,3,2,1,3,1,1,1
440
+ 1,1,27,4,9,2442,1,5,4,3,1,4,3,43,2,2,4,4,2,2,1
441
+ 1,2,18,4,9,3590,1,1,3,4,1,3,3,40,3,2,3,1,2,2,1
442
+ 1,4,21,4,2,2288,1,2,4,2,1,4,2,23,3,2,1,3,1,2,1
443
+ 1,4,27,3,9,5117,1,4,3,3,1,4,3,26,3,2,2,3,1,1,1
444
+ 1,1,39,4,2,14179,5,4,4,3,1,4,2,30,3,2,2,4,1,2,1
445
+ 1,4,15,2,3,1386,5,3,4,4,1,2,1,40,3,1,1,3,1,2,1
446
+ 1,4,12,4,3,618,1,5,4,3,1,4,1,56,3,2,1,3,1,1,1
447
+ 1,4,12,2,2,1574,1,3,4,3,1,2,1,50,3,2,1,3,1,1,1
448
+ 1,4,6,4,3,700,5,5,4,3,1,4,4,36,3,3,2,3,1,1,1
449
+ 1,4,12,2,3,886,5,3,4,2,1,2,3,21,3,2,1,3,1,1,1
450
+ 1,4,36,2,1,4686,1,3,2,3,1,2,4,32,3,3,1,4,1,2,1
451
+ 1,2,9,2,3,790,3,3,4,2,1,3,1,66,3,2,1,2,1,1,1
452
+ 0,2,12,2,3,766,3,3,4,3,1,3,1,66,3,2,1,2,1,1,1
453
+ 1,1,20,2,2,2212,5,4,4,3,1,4,3,39,3,2,1,3,1,2,1
454
+ 1,2,10,2,0,7308,1,1,2,3,1,4,4,70,1,3,1,4,1,2,1
455
+ 1,2,24,4,6,5743,1,2,2,2,1,4,4,24,3,3,2,3,1,2,1
456
+ 1,1,14,2,0,3973,1,1,1,3,1,4,4,22,3,3,1,3,1,1,1
457
+ 1,2,60,3,3,7418,5,3,1,3,1,1,1,27,3,2,1,2,1,1,1
458
+ 1,2,20,3,10,2629,1,3,2,3,1,3,3,29,1,2,2,3,1,2,1
459
+ 1,2,18,2,9,1941,4,3,4,3,1,2,2,35,3,2,1,2,1,2,1
460
+ 1,2,24,3,2,2333,5,2,4,3,1,2,2,29,1,2,1,2,1,1,1
461
+ 1,4,12,2,1,2445,5,2,2,4,1,4,3,26,3,1,1,3,1,2,1
462
+ 1,2,20,2,1,6468,5,1,1,1,1,4,1,60,3,2,1,4,1,2,1
463
+ 1,2,18,4,2,7374,1,1,4,3,1,4,2,40,2,2,2,4,1,2,1
464
+ 1,4,15,2,1,3812,2,2,1,2,1,4,3,23,3,2,1,3,1,2,1
465
+ 0,1,28,2,0,4006,1,3,3,3,1,2,3,45,3,2,1,2,1,1,1
466
+ 1,2,12,2,0,7472,5,1,1,2,1,2,1,24,3,1,1,1,1,1,1
467
+ 1,3,12,2,2,1424,5,5,3,2,1,4,1,55,3,2,1,4,1,2,1
468
+ 1,2,12,2,1,2028,5,3,4,3,1,2,3,30,3,2,1,3,1,1,1
469
+ 1,4,15,2,0,5324,3,5,1,2,1,4,4,35,3,3,1,3,1,1,1
470
+ 1,2,36,2,3,2323,1,4,4,3,1,4,3,24,3,1,1,3,1,1,1
471
+ 1,4,12,2,6,1393,1,5,4,3,1,4,2,47,1,2,3,3,2,2,1
472
+ 1,4,18,2,2,1984,1,3,4,3,1,4,4,47,1,3,2,3,1,1,1
473
+ 1,4,24,2,3,999,5,5,4,3,1,2,3,25,3,2,2,3,1,1,1
474
+ 1,4,36,2,9,7409,5,5,3,3,1,2,2,37,3,2,2,3,1,1,1
475
+ 1,4,15,2,2,2186,5,4,1,2,1,4,1,33,1,1,1,2,1,1,1
476
+ 1,3,36,2,3,4473,1,5,4,3,1,2,3,31,3,2,1,3,1,1,1
477
+ 1,4,24,2,8,937,1,2,4,4,1,3,3,27,3,2,2,2,1,1,1
478
+ 1,4,18,2,2,3422,1,5,4,3,1,4,2,47,1,2,3,3,2,2,1
479
+ 1,4,24,2,3,3105,5,2,4,3,1,2,3,25,3,2,2,3,1,1,1
480
+ 1,4,12,4,6,2748,1,5,2,2,1,4,4,57,1,3,3,2,1,1,1
481
+ 1,2,18,2,5,3872,1,1,2,2,1,4,3,67,3,2,1,3,1,2,1
482
+ 1,4,27,2,5,5190,5,5,4,3,1,4,2,48,3,2,4,3,2,2,1
483
+ 1,2,18,2,2,3001,1,4,2,2,1,4,1,40,3,1,1,3,1,1,1
484
+ 1,4,24,3,9,3863,1,3,1,3,1,2,4,32,3,3,1,3,1,1,1
485
+ 1,4,12,4,2,5801,5,5,2,3,1,4,2,49,3,1,1,3,1,2,2
486
+ 1,4,12,4,2,1592,4,4,3,2,1,2,2,35,3,2,1,3,1,1,1
487
+ 1,4,12,4,9,1185,1,3,3,2,1,2,1,27,3,2,2,3,1,1,1
488
+ 1,4,18,4,2,3780,1,2,3,1,1,2,3,35,3,2,2,4,1,2,1
489
+ 1,2,18,4,2,3612,1,5,3,2,1,4,2,37,3,2,1,3,1,2,2
490
+ 1,4,12,2,9,1076,1,3,2,4,1,2,1,26,3,2,1,3,1,2,1
491
+ 1,4,12,2,0,3527,5,2,2,3,1,3,2,45,3,2,1,4,2,2,1
492
+ 1,4,18,2,3,2051,1,2,4,3,1,1,1,33,3,2,1,3,1,1,1
493
+ 1,4,12,4,2,3331,1,5,2,3,1,4,2,42,2,2,1,3,1,1,1
494
+ 1,1,18,0,9,3104,1,4,3,3,1,1,2,31,1,2,1,3,1,2,1
495
+ 1,4,24,4,3,2611,1,5,4,4,2,3,1,46,3,2,2,3,1,1,1
496
+ 1,1,12,4,1,1409,1,5,4,3,1,3,1,54,3,2,1,3,1,1,1
497
+ 1,4,24,2,3,1311,2,4,4,4,1,3,2,26,3,2,1,3,1,2,1
498
+ 1,4,6,2,3,2108,1,4,2,4,1,2,1,29,3,1,1,3,1,1,1
499
+ 1,4,24,4,1,4042,5,4,3,3,1,4,2,43,3,2,2,3,1,2,1
500
+ 1,4,12,4,0,926,1,1,1,2,1,2,2,38,3,2,1,1,1,1,1
501
+ 1,1,12,2,3,1680,3,5,3,4,1,1,1,35,3,2,1,3,1,1,1
502
+ 1,4,24,2,0,1249,1,2,4,4,1,2,1,28,3,2,1,3,1,1,1
503
+ 1,4,24,4,0,2463,2,4,4,4,1,3,2,27,3,2,2,3,1,2,1
504
+ 1,4,6,2,3,1595,1,4,3,3,1,2,2,51,3,2,1,3,2,1,1
505
+ 1,4,24,4,5,2058,1,3,4,1,1,2,1,33,3,2,2,3,1,2,1
506
+ 1,4,24,2,1,7814,1,4,3,3,1,3,3,38,3,2,1,4,1,2,1
507
+ 1,4,6,4,3,1740,1,5,2,4,1,2,1,30,3,1,2,3,1,1,1
508
+ 1,4,12,4,3,1240,5,5,4,2,1,2,1,38,3,2,2,3,1,2,1
509
+ 1,4,24,4,1,6842,5,3,2,3,1,4,2,46,3,2,2,4,2,2,1
510
+ 1,4,24,4,2,5150,1,5,4,3,1,4,3,33,3,2,1,3,1,2,1
511
+ 1,1,6,2,0,1203,2,5,3,3,1,2,2,43,3,2,1,3,1,2,1
512
+ 1,4,6,4,0,2080,3,3,1,4,1,2,3,24,3,2,1,3,1,1,1
513
+ 1,4,6,2,6,1538,1,2,1,2,1,2,4,56,3,2,1,3,1,1,1
514
+ 1,2,24,4,0,3878,2,2,4,1,1,2,3,37,3,2,1,3,1,2,1
515
+ 1,2,30,2,2,3832,1,2,2,4,1,1,2,22,3,2,1,3,1,1,1
516
+ 1,4,15,2,0,3186,4,4,2,2,1,3,3,20,3,1,1,3,1,1,1
517
+ 1,2,24,2,3,2896,2,2,2,3,1,1,3,29,3,2,1,3,1,1,1
518
+ 1,2,24,3,9,6967,2,4,4,3,1,4,3,36,3,1,1,4,1,2,1
519
+ 0,4,36,2,6,1819,1,3,4,3,1,4,4,37,2,3,1,3,1,2,1
520
+ 0,4,24,2,3,5943,5,2,1,2,1,1,3,44,3,2,2,3,1,2,1
521
+ 0,4,36,4,2,7127,1,2,2,2,1,4,2,23,3,1,2,3,1,2,1
522
+ 0,4,36,2,2,3349,1,3,4,2,1,2,3,28,3,2,1,4,1,2,1
523
+ 0,4,36,2,2,10974,1,1,4,2,1,2,3,26,3,2,2,4,1,2,1
524
+ 1,4,6,2,3,518,1,3,3,2,1,1,1,29,3,2,1,3,1,1,1
525
+ 1,4,18,2,3,1126,5,2,4,2,1,2,1,21,3,1,1,3,1,2,1
526
+ 1,2,12,4,1,1860,1,1,4,3,1,2,3,34,3,2,2,4,1,2,1
527
+ 1,4,36,4,3,9566,1,3,2,2,1,2,3,31,2,2,2,3,1,1,1
528
+ 1,1,12,2,3,701,1,3,4,4,1,2,1,40,3,2,1,2,1,1,1
529
+ 1,2,12,2,3,2930,1,4,2,2,1,1,1,27,3,2,1,3,1,1,1
530
+ 1,4,18,2,3,1505,1,3,4,3,1,2,4,32,3,3,1,4,1,2,1
531
+ 1,4,18,4,3,2238,1,3,2,2,1,1,3,25,3,2,2,3,1,1,1
532
+ 1,4,4,4,3,1503,1,4,2,3,1,1,1,42,3,2,2,2,2,1,1
533
+ 1,4,24,4,1,2197,5,4,4,3,1,4,3,43,3,2,2,3,2,2,1
534
+ 1,3,12,2,3,1881,1,3,2,2,1,2,3,44,3,1,1,2,1,2,1
535
+ 1,1,18,4,3,1880,1,4,4,4,1,1,2,32,3,2,2,4,1,2,1
536
+ 1,1,18,2,3,2389,1,2,4,2,1,1,3,27,2,2,1,3,1,1,1
537
+ 1,2,24,2,3,1967,1,5,4,2,1,4,3,20,3,2,1,3,1,2,1
538
+ 1,4,4,4,0,3380,1,4,1,2,1,1,1,37,3,2,1,3,2,1,1
539
+ 1,4,4,4,0,1455,1,4,2,3,1,1,1,42,3,2,3,2,2,1,1
540
+ 1,4,7,4,3,730,5,5,4,3,1,2,2,46,3,1,2,2,1,2,1
541
+ 1,2,18,0,2,3244,1,3,1,2,1,4,3,33,1,2,2,3,1,2,1
542
+ 0,2,9,2,3,1670,1,2,4,2,1,2,3,22,3,2,1,3,1,2,1
543
+ 1,2,48,2,3,3979,5,4,4,3,1,1,3,41,3,2,2,3,2,2,1
544
+ 0,2,12,2,2,1922,1,3,4,3,1,2,2,37,3,2,1,2,1,1,1
545
+ 1,2,18,4,2,1295,1,2,4,2,1,1,2,27,3,2,2,3,1,1,1
546
+ 1,4,4,4,3,1544,1,4,2,3,1,1,1,42,3,2,3,2,2,1,1
547
+ 1,2,8,2,9,907,1,2,3,4,1,2,1,26,3,2,1,3,1,2,1
548
+ 1,2,30,2,3,1715,5,3,4,2,1,1,3,26,3,2,1,3,1,1,1
549
+ 1,3,10,4,3,1347,5,4,4,3,1,2,2,27,3,2,2,3,1,2,1
550
+ 1,2,12,2,0,1007,4,3,4,4,1,1,1,22,3,2,1,3,1,1,1
551
+ 1,4,12,4,2,1402,3,4,3,2,1,4,3,37,3,1,1,3,1,2,1
552
+ 1,2,12,2,0,2002,1,4,3,3,1,4,2,30,3,1,1,3,2,2,1
553
+ 1,4,12,4,6,2096,1,4,2,3,1,3,1,49,3,2,1,2,2,1,1
554
+ 1,4,12,2,0,1101,1,3,3,4,1,2,1,27,3,2,2,3,1,2,1
555
+ 1,4,10,2,8,894,5,4,4,2,1,3,2,40,3,2,1,3,1,2,1
556
+ 1,2,11,2,2,1577,4,2,4,2,1,1,1,20,3,2,1,3,1,1,1
557
+ 1,4,33,3,9,2764,1,3,2,2,1,2,3,26,3,2,2,3,1,2,1
558
+ 1,2,48,0,0,8358,3,2,1,2,1,1,3,30,3,2,2,3,1,1,1
559
+ 1,3,12,2,2,1474,1,2,4,2,1,1,2,33,1,2,1,4,1,2,1
560
+ 1,4,24,2,1,5433,5,1,2,2,1,4,2,26,3,1,1,4,1,2,1
561
+ 1,2,14,2,9,1410,3,5,1,4,1,2,1,35,3,2,1,3,1,2,1
562
+ 1,4,20,4,0,3485,5,2,2,1,1,4,1,44,3,2,2,3,1,2,1
563
+ 1,4,18,4,1,3850,1,4,3,3,1,1,3,27,3,2,2,3,1,1,1
564
+ 0,2,60,2,0,7408,2,2,4,2,1,2,2,24,3,2,1,4,1,1,1
565
+ 1,3,24,2,3,1377,2,5,4,2,1,2,4,47,3,3,1,3,1,2,1
566
+ 1,4,30,3,9,4272,2,3,2,3,1,2,2,26,3,2,2,2,1,1,1
567
+ 1,2,24,3,3,1553,2,4,3,2,1,2,2,23,3,1,2,3,1,2,1
568
+ 1,2,36,3,9,9857,2,4,1,3,1,3,2,31,3,2,2,2,2,2,1
569
+ 1,4,6,4,0,362,2,3,4,2,1,4,3,52,3,2,2,2,1,1,1
570
+ 1,4,12,4,2,1935,1,5,4,3,1,4,1,43,3,2,3,3,1,2,1
571
+ 1,4,48,2,3,10222,5,4,4,3,1,3,3,37,2,2,1,3,1,2,1
572
+ 1,3,12,2,0,1330,1,2,4,3,1,1,1,26,3,2,1,3,1,1,1
573
+ 1,4,36,2,6,9055,5,3,2,3,1,4,4,35,3,3,1,2,2,2,1
574
+ 1,2,26,2,1,7966,1,2,2,3,1,3,3,30,3,2,2,3,1,1,1
575
+ 1,2,30,1,2,3496,4,3,4,3,1,2,3,34,2,2,1,3,2,2,1
576
+ 1,2,36,2,1,6948,1,3,2,3,1,2,3,35,3,1,1,4,1,2,1
577
+ 1,2,48,0,9,12204,5,3,2,3,1,2,3,48,1,2,1,4,1,2,1
578
+ 0,1,36,2,2,3446,1,5,4,3,1,2,3,42,3,2,1,3,2,1,1
579
+ 0,1,12,2,6,684,1,3,4,3,1,4,3,40,3,1,1,2,2,1,1
580
+ 0,1,33,4,2,4281,3,3,1,2,1,4,3,23,3,2,2,3,1,1,1
581
+ 0,1,42,2,3,7174,5,4,4,2,1,3,3,30,3,2,1,4,1,2,1
582
+ 0,1,24,1,3,1546,1,4,4,3,3,4,3,24,1,1,1,2,1,1,1
583
+ 0,1,24,2,2,2359,2,1,1,1,1,1,2,33,3,2,1,3,1,1,1
584
+ 0,4,24,2,3,3621,2,5,2,3,1,4,3,31,3,2,2,3,1,1,1
585
+ 0,1,12,2,4,741,2,1,4,2,1,3,2,22,3,2,1,3,1,1,1
586
+ 0,1,12,2,2,7865,1,5,4,3,1,4,4,53,3,3,1,4,1,2,1
587
+ 1,1,24,2,1,2910,1,4,2,3,1,1,4,34,3,3,1,4,1,2,1
588
+ 1,1,18,4,0,5302,1,5,2,3,1,4,4,36,3,3,3,4,1,2,1
589
+ 1,1,36,2,2,3620,1,3,1,3,3,2,2,37,3,2,1,3,2,1,1
590
+ 1,1,18,2,3,3509,1,4,4,2,3,1,1,25,3,2,1,3,1,1,1
591
+ 1,2,12,2,2,3017,1,2,3,2,1,1,1,34,3,1,1,4,1,1,1
592
+ 1,1,12,2,2,1657,1,3,2,3,1,2,1,27,3,2,1,3,1,1,1
593
+ 1,1,8,4,10,1164,1,5,3,3,1,4,4,51,1,3,2,4,2,2,1
594
+ 0,1,36,4,2,6229,1,2,4,2,2,4,4,23,3,1,2,2,1,2,1
595
+ 0,1,24,1,0,1193,1,1,1,2,2,4,4,29,3,1,2,1,1,1,1
596
+ 1,1,30,0,2,4583,1,3,2,1,3,2,1,32,3,2,2,3,1,1,1
597
+ 1,1,36,4,2,5371,1,3,3,3,3,2,2,28,3,2,2,3,1,1,1
598
+ 1,1,12,2,2,708,1,3,2,3,3,3,2,38,3,2,1,2,2,1,1
599
+ 1,1,21,4,0,571,1,5,4,3,1,4,1,65,3,2,2,3,1,1,1
600
+ 1,1,30,2,3,2522,1,5,1,3,3,3,2,39,3,2,1,3,2,1,1
601
+ 0,1,36,2,2,5179,1,4,4,3,1,2,2,29,3,2,1,3,1,1,1
602
+ 0,1,36,2,1,8229,1,3,2,3,1,2,2,26,3,2,1,3,2,1,1
603
+ 1,4,24,4,2,2028,1,4,2,3,1,2,2,30,3,2,2,2,1,1,1
604
+ 1,1,6,2,0,1374,5,1,4,2,1,3,2,75,3,2,1,4,1,2,1
605
+ 1,1,12,2,2,1289,1,3,4,3,3,1,2,21,3,2,1,2,1,1,1
606
+ 0,1,36,2,2,2712,1,5,2,3,1,2,2,41,1,2,1,3,2,1,1
607
+ 1,1,15,4,2,975,1,3,2,1,1,3,2,25,3,2,2,3,1,1,1
608
+ 1,2,6,3,2,1050,1,1,4,3,1,1,2,35,2,2,2,4,1,2,2
609
+ 1,1,6,4,0,609,1,4,4,2,1,3,2,37,3,2,2,3,1,1,1
610
+ 1,1,48,2,1,4788,1,4,4,3,1,3,2,26,3,2,1,3,2,1,1
611
+ 1,2,24,2,2,3069,2,5,4,3,1,4,4,30,3,3,1,3,1,1,1
612
+ 0,2,12,2,0,836,2,2,4,2,1,2,2,23,1,2,1,2,1,1,1
613
+ 1,1,12,2,2,2577,1,3,2,1,1,1,3,42,3,2,1,3,1,1,1
614
+ 1,1,12,2,2,1620,1,3,2,2,2,3,2,30,3,2,1,3,1,1,1
615
+ 1,1,15,2,2,1845,1,2,4,2,3,1,2,46,3,1,1,3,1,1,1
616
+ 1,1,24,2,1,6579,1,1,4,3,1,2,4,29,3,3,1,4,1,2,1
617
+ 1,1,12,2,0,1893,1,3,4,2,3,4,2,29,3,2,1,3,1,2,1
618
+ 1,1,30,4,1,10623,1,5,3,3,1,4,4,38,3,3,3,4,2,2,1
619
+ 1,1,18,2,0,2249,2,4,4,3,1,3,3,30,3,2,1,4,2,2,1
620
+ 0,1,30,2,2,3108,1,2,2,1,1,4,2,31,3,2,1,2,1,1,1
621
+ 1,2,12,4,0,958,1,4,2,3,1,3,1,47,3,2,2,2,2,1,1
622
+ 1,4,24,2,1,9277,5,3,2,1,1,4,4,48,3,3,1,3,1,2,1
623
+ 1,4,24,4,10,6314,1,1,4,3,2,2,4,27,1,2,2,4,1,2,1
624
+ 1,1,12,4,1,1526,1,5,4,3,1,4,4,66,3,3,2,4,1,1,1
625
+ 1,1,12,2,2,3590,1,3,2,3,2,2,2,29,3,2,1,2,2,1,1
626
+ 1,1,24,4,1,6615,1,1,2,3,1,4,4,75,3,3,2,4,1,2,1
627
+ 1,1,6,4,2,1872,1,1,4,3,1,4,4,36,3,3,3,4,1,2,1
628
+ 1,4,12,2,0,2859,5,1,4,3,1,4,4,38,3,2,1,4,1,2,1
629
+ 1,4,18,4,3,1582,4,5,4,3,1,4,3,46,3,2,2,3,1,1,1
630
+ 1,4,6,2,8,1238,5,1,4,3,1,4,2,36,3,2,1,4,2,2,1
631
+ 1,1,12,2,2,2578,1,1,3,2,1,4,4,55,3,3,1,4,1,1,1
632
+ 1,1,15,4,2,1433,1,3,4,2,1,3,2,25,3,1,2,3,1,1,1
633
+ 1,1,42,2,2,7882,1,4,2,3,3,4,2,45,3,3,1,3,2,1,1
634
+ 1,1,24,2,2,4169,1,3,4,3,1,4,2,28,3,2,1,3,1,1,1
635
+ 1,1,36,2,2,3959,1,1,4,3,1,3,2,30,3,2,1,4,1,2,1
636
+ 1,1,36,2,0,3249,1,4,2,3,1,4,4,39,1,3,1,4,2,2,1
637
+ 1,1,24,2,2,3149,1,2,4,3,1,1,4,22,1,3,1,3,1,1,1
638
+ 0,1,12,4,2,2246,1,5,3,3,1,3,2,60,3,2,2,3,1,1,1
639
+ 1,1,13,4,9,1797,1,2,3,3,1,1,2,28,1,2,2,2,1,1,1
640
+ 1,1,20,4,2,4272,1,5,1,2,1,4,2,24,3,2,2,3,1,1,1
641
+ 1,1,24,4,1,2957,1,5,4,3,1,4,2,63,3,2,2,3,1,2,1
642
+ 1,1,36,4,2,2348,1,3,3,4,1,2,2,46,3,2,2,3,1,2,1
643
+ 1,3,42,0,9,6289,1,2,2,1,1,1,2,33,3,2,2,3,1,1,1
644
+ 1,1,24,4,1,6419,1,5,2,2,1,4,4,44,3,3,2,4,2,2,1
645
+ 0,1,48,4,1,6143,1,5,4,2,1,4,4,58,2,3,2,2,1,1,1
646
+ 1,4,24,4,6,1597,1,5,4,3,1,4,4,54,3,3,2,3,2,1,1
647
+ 1,1,36,2,10,15857,1,1,2,1,2,3,3,43,3,2,1,4,1,1,1
648
+ 1,4,24,4,3,2223,2,5,4,3,1,4,2,52,1,2,2,3,1,1,1
649
+ 1,4,48,3,3,7238,5,5,3,3,1,3,3,32,1,2,2,3,2,1,1
650
+ 1,2,30,3,9,2503,2,5,4,3,1,2,2,41,2,2,2,3,1,1,1
651
+ 1,2,18,2,9,2622,2,3,4,3,1,4,3,34,3,2,1,3,1,1,1
652
+ 1,2,24,2,2,4351,5,3,1,2,1,4,2,48,3,2,1,2,1,2,1
653
+ 1,2,6,2,3,368,5,5,4,3,1,4,2,38,3,2,1,3,1,1,1
654
+ 1,2,12,2,8,754,5,5,4,3,1,4,2,38,3,2,2,3,1,1,1
655
+ 1,4,24,4,3,2424,5,5,4,3,1,4,2,53,3,2,2,3,1,1,1
656
+ 1,2,48,3,9,6681,5,3,4,3,1,4,4,38,3,3,1,3,2,2,1
657
+ 1,2,18,3,9,2427,5,5,4,3,1,2,2,42,3,2,2,3,1,1,1
658
+ 0,2,24,4,3,1216,2,2,4,3,1,4,4,38,1,2,2,3,2,1,1
659
+ 1,2,6,2,3,753,1,3,2,2,3,3,1,64,3,2,1,3,1,1,1
660
+ 1,2,7,2,3,2576,1,3,2,3,3,2,1,35,3,2,1,3,1,1,2
661
+ 1,2,6,2,3,590,1,2,3,4,1,3,1,26,3,2,1,2,1,1,2
662
+ 1,2,8,2,3,1414,1,3,4,3,3,2,1,33,3,2,1,3,1,1,2
663
+ 1,2,12,2,3,1103,1,4,4,3,3,3,1,29,3,2,2,3,1,1,1
664
+ 1,2,12,3,3,585,1,3,4,4,2,4,1,20,3,1,2,3,1,1,1
665
+ 1,2,6,2,3,1068,1,5,4,3,1,4,3,28,3,2,1,3,2,1,1
666
+ 1,1,8,4,0,713,1,5,4,3,1,4,1,47,3,2,2,2,1,1,1
667
+ 1,2,12,2,3,1092,1,3,4,2,3,4,1,49,3,2,2,3,1,2,1
668
+ 1,2,7,2,3,2329,1,2,1,2,3,1,1,45,3,2,1,3,1,1,1
669
+ 1,2,13,4,3,882,1,2,4,3,3,4,1,23,3,2,2,3,1,1,1
670
+ 1,2,18,2,3,866,1,3,4,4,3,2,1,25,3,2,1,2,1,1,1
671
+ 1,2,7,2,3,2415,1,3,3,3,3,2,1,34,3,2,1,3,1,1,1
672
+ 1,2,13,2,3,2101,1,2,2,2,3,4,2,23,3,2,1,2,1,1,1
673
+ 1,2,18,2,3,1301,1,5,4,4,3,2,1,32,3,2,1,2,1,1,1
674
+ 1,2,18,2,3,1113,1,3,4,2,3,4,1,26,3,2,1,2,2,1,1
675
+ 1,2,8,2,3,760,1,4,4,2,3,2,1,44,3,2,1,2,1,1,1
676
+ 1,2,12,2,3,625,1,2,4,4,3,1,1,26,1,2,1,2,1,1,1
677
+ 1,3,6,4,0,1323,2,5,2,1,1,4,3,28,3,2,2,3,2,2,1
678
+ 1,1,9,4,3,1138,1,3,4,3,1,4,1,25,3,2,2,2,1,1,1
679
+ 1,2,18,4,3,1795,1,5,3,2,3,4,1,48,1,1,2,2,1,2,1
680
+ 1,2,15,4,3,2728,5,4,4,3,3,2,1,35,1,2,3,3,1,2,1
681
+ 1,2,6,2,3,484,1,4,3,4,3,3,1,28,1,2,1,2,1,1,1
682
+ 1,2,10,1,3,1048,1,3,4,3,1,4,1,23,2,2,1,2,1,1,1
683
+ 1,2,12,2,3,1155,1,5,3,4,3,3,1,40,1,2,2,2,1,1,1
684
+ 1,2,20,3,1,7057,5,4,3,3,1,4,2,36,1,1,2,4,2,2,1
685
+ 1,2,15,4,3,1537,5,5,4,3,3,4,1,50,3,2,2,3,1,2,1
686
+ 1,1,12,2,3,2214,1,3,4,3,1,3,2,24,3,2,1,2,1,1,1
687
+ 1,4,24,4,2,1585,1,4,4,3,1,3,2,40,3,2,2,3,1,1,1
688
+ 1,2,10,2,2,1521,1,3,4,1,1,2,3,31,3,2,1,2,1,1,1
689
+ 1,2,36,1,4,3990,5,2,3,2,1,2,4,29,1,2,1,1,1,1,1
690
+ 1,3,18,2,2,3049,1,2,1,2,1,1,2,45,2,2,1,2,1,1,1
691
+ 0,1,24,2,3,1282,2,3,4,2,1,2,3,32,3,2,1,2,1,1,1
692
+ 1,4,60,2,3,10144,2,4,2,2,1,4,1,21,3,2,1,3,1,2,1
693
+ 1,1,12,2,0,1168,1,3,4,4,1,3,1,27,3,2,1,2,1,1,1
694
+ 1,2,6,2,5,454,1,2,3,4,1,1,2,22,3,2,1,2,1,1,1
695
+ 1,4,15,3,1,3594,1,2,1,2,1,2,2,46,3,2,2,2,1,1,1
696
+ 1,4,12,2,2,1768,1,3,3,3,1,2,1,24,3,1,1,2,1,1,1
697
+ 1,4,60,3,3,15653,1,4,2,3,1,4,3,21,3,2,2,3,1,2,1
698
+ 1,3,12,3,0,2247,1,3,2,2,1,2,3,36,2,2,2,3,1,2,1
699
+ 1,4,24,2,3,1413,1,3,4,4,1,2,2,28,3,2,1,3,1,1,1
700
+ 1,2,45,4,1,4576,2,1,3,3,1,4,3,27,3,2,1,3,1,1,1
701
+ 1,1,24,4,3,1231,4,5,4,2,1,4,2,57,3,1,2,4,1,2,1
702
+ 0,1,36,2,1,8335,5,5,3,3,1,4,4,47,3,3,1,3,1,1,1
703
+ 1,2,36,4,1,5800,1,3,3,3,1,4,3,34,3,2,2,3,1,2,1
704
+ 1,1,18,3,6,8471,5,3,1,2,1,2,3,23,3,1,2,3,1,2,1
705
+ 1,1,30,2,2,3622,4,5,4,2,1,4,2,57,3,1,2,3,1,2,1
706
+ 1,1,6,4,3,1169,5,5,4,3,1,4,1,67,3,2,2,3,1,2,1
707
+ 1,4,15,2,4,1262,3,4,4,3,1,3,2,36,3,2,2,3,1,2,1
708
+ 1,3,24,4,2,3617,5,5,4,3,2,4,4,20,3,1,2,3,1,1,1
709
+ 1,2,30,4,0,2181,5,5,4,3,1,4,1,36,3,2,2,3,1,1,1
710
+ 0,1,48,1,9,7685,1,4,2,2,3,4,3,37,3,1,1,3,1,1,1
711
+ 1,4,48,4,6,6110,1,3,1,3,1,3,4,31,1,3,1,3,1,2,1
712
+ 1,4,24,2,0,3757,1,5,4,2,2,4,4,62,3,3,1,3,1,2,1
713
+ 1,1,42,4,5,3394,1,1,4,3,2,4,3,65,3,2,2,1,1,1,1
714
+ 1,4,36,4,9,6304,5,5,4,3,1,4,1,36,3,2,2,3,1,1,1
715
+ 1,4,9,4,6,1244,5,5,4,2,1,4,2,41,3,1,2,2,1,1,1
716
+ 1,4,6,2,0,3518,1,3,2,3,3,3,2,26,3,1,1,3,1,1,1
717
+ 1,4,36,0,5,2613,1,3,4,3,1,2,3,27,3,2,2,3,1,1,1
718
+ 1,1,48,2,6,7476,1,4,4,3,1,1,4,50,3,3,1,4,1,2,1
719
+ 0,4,24,2,9,4591,4,3,2,3,1,3,2,54,3,2,3,4,1,2,1
720
+ 0,2,18,2,2,1924,5,2,4,2,1,3,1,27,3,1,1,3,1,1,1
721
+ 0,2,72,2,3,5595,2,3,2,4,1,2,3,24,3,2,1,3,1,1,1
722
+ 0,2,48,3,6,6224,1,5,4,3,1,4,4,50,3,3,1,3,1,1,1
723
+ 1,3,15,2,6,1905,1,5,4,3,1,4,3,40,3,1,1,4,1,2,1
724
+ 1,4,21,3,1,2993,1,3,3,3,1,2,1,28,2,2,2,2,1,1,1
725
+ 1,4,36,3,1,8947,5,4,3,3,1,2,3,31,2,2,1,4,2,2,1
726
+ 1,1,24,2,2,4020,1,3,2,3,1,2,3,27,2,2,1,3,1,1,1
727
+ 1,2,18,2,1,2779,1,3,1,4,1,3,3,21,3,1,1,3,1,2,1
728
+ 1,4,21,2,0,2782,3,4,1,2,1,2,3,31,1,2,1,4,1,1,1
729
+ 1,4,12,2,0,1884,1,5,4,3,1,4,3,39,3,2,1,4,1,2,1
730
+ 1,4,36,4,1,11054,5,3,4,3,1,2,3,30,3,2,1,4,1,2,1
731
+ 1,2,60,3,3,9157,5,3,2,3,1,2,4,27,3,3,1,4,1,1,1
732
+ 1,2,42,1,1,9283,1,1,1,3,1,2,4,55,1,3,1,4,1,2,1
733
+ 1,4,60,2,0,6527,5,3,4,3,1,4,4,34,3,3,1,3,2,2,1
734
+ 1,4,15,4,1,3368,4,5,3,3,1,4,4,23,3,1,2,3,1,2,1
735
+ 1,1,15,2,0,2511,1,1,1,2,1,4,3,23,3,1,1,3,1,1,1
736
+ 1,1,36,2,1,5493,1,5,2,3,1,4,4,42,3,3,1,3,2,1,1
737
+ 1,4,6,2,4,1338,3,3,1,1,1,4,1,62,3,2,1,3,1,1,1
738
+ 1,2,9,2,3,1082,1,5,4,3,1,4,3,37,3,2,2,2,1,1,1
739
+ 1,4,18,4,3,1149,4,3,4,3,1,3,1,46,3,2,2,3,1,1,1
740
+ 1,2,15,2,5,1308,1,5,4,3,1,4,3,38,3,2,2,2,1,1,1
741
+ 1,2,20,0,1,6148,2,5,3,4,1,4,3,31,1,2,2,3,1,2,1
742
+ 1,4,12,2,2,1736,1,4,3,2,1,4,1,31,3,2,1,2,1,1,1
743
+ 1,4,12,2,3,3059,4,4,2,1,1,4,1,61,3,2,1,2,1,1,1
744
+ 0,1,24,2,2,2996,5,3,2,4,1,4,3,20,3,2,1,3,1,1,1
745
+ 1,4,30,4,1,7596,5,5,1,3,1,4,3,63,3,2,2,3,1,1,1
746
+ 1,4,30,2,1,4811,5,4,2,2,1,4,2,24,2,1,1,2,1,1,1
747
+ 1,4,6,2,2,1766,1,3,1,4,1,2,2,21,3,1,1,3,1,1,1
748
+ 1,2,24,2,1,2760,5,5,4,3,1,4,4,36,1,3,1,3,1,2,1
749
+ 1,4,24,4,5,5507,1,5,3,3,1,4,4,44,3,3,2,3,1,1,1
750
+ 1,2,9,2,6,1199,1,4,4,2,1,4,2,67,3,2,2,4,1,2,1
751
+ 1,3,24,2,2,2892,1,5,3,1,1,4,4,51,3,3,1,3,1,1,1
752
+ 1,2,36,3,0,2862,2,5,4,3,1,3,4,30,3,3,1,3,1,1,1
753
+ 0,1,9,2,0,654,1,3,4,3,1,3,3,28,3,2,1,2,1,1,1
754
+ 0,2,9,4,6,1136,4,5,4,3,1,3,4,32,3,3,2,3,2,1,1
755
+ 0,2,24,2,1,4113,3,2,3,2,1,4,3,28,3,1,1,3,1,1,1
756
+ 0,2,6,2,0,14555,5,1,1,3,1,2,2,23,3,2,1,1,1,2,1
757
+ 0,1,15,0,0,950,1,5,4,3,1,3,3,33,3,1,2,3,2,1,1
758
+ 0,1,24,4,0,1199,1,5,4,3,1,4,3,60,3,2,2,2,1,1,1
759
+ 0,1,12,0,0,1082,1,3,4,3,1,4,3,48,1,2,2,3,1,1,1
760
+ 0,2,30,2,0,2150,1,3,4,2,3,2,4,24,1,2,1,3,1,1,1
761
+ 0,2,36,4,0,2820,1,2,4,1,1,4,3,27,3,2,2,3,1,1,1
762
+ 0,2,48,2,3,3060,1,4,4,3,1,4,1,28,3,2,2,3,1,1,1
763
+ 0,1,18,2,3,2600,1,3,4,3,1,4,4,65,3,3,2,3,1,1,1
764
+ 0,4,21,0,0,5003,5,3,1,2,1,4,2,29,1,2,2,3,1,2,1
765
+ 0,2,60,2,6,6288,1,3,4,3,1,4,4,42,3,3,1,3,1,1,1
766
+ 0,4,24,3,0,2538,1,5,4,3,1,4,3,47,3,2,2,2,2,1,1
767
+ 0,4,9,2,3,1478,1,4,4,3,1,2,3,22,3,2,1,3,1,1,1
768
+ 0,2,39,4,3,4933,1,4,2,3,3,2,1,25,3,2,2,3,1,1,1
769
+ 0,4,18,4,0,1530,1,3,3,3,1,2,2,32,1,2,2,3,1,1,1
770
+ 0,2,9,1,0,1437,2,4,2,3,1,3,4,29,3,2,1,3,1,1,1
771
+ 0,1,15,2,4,1275,5,3,4,2,1,2,3,24,3,1,1,3,1,1,1
772
+ 0,1,24,2,3,1823,1,1,4,3,1,2,3,30,2,2,1,4,2,1,1
773
+ 0,1,9,2,0,1422,1,2,3,3,1,2,4,27,3,3,1,4,1,2,1
774
+ 0,1,18,2,4,1217,1,3,4,4,1,3,1,47,3,2,1,2,1,2,1
775
+ 0,1,36,2,0,9271,1,4,2,3,1,1,3,24,3,2,1,3,1,2,1
776
+ 0,1,36,3,9,2145,1,4,2,3,1,1,3,24,3,2,2,3,1,2,1
777
+ 0,1,36,2,0,1842,1,2,4,2,1,4,3,34,3,2,1,3,1,2,1
778
+ 0,2,18,3,2,4297,1,5,4,1,1,3,4,40,3,2,1,4,1,2,1
779
+ 0,1,6,4,2,3384,1,3,1,1,1,4,1,44,3,1,1,4,1,2,1
780
+ 0,2,18,4,3,1245,1,3,4,4,1,2,3,33,3,2,1,3,1,1,1
781
+ 0,4,15,2,6,4623,2,3,3,3,1,2,2,40,3,2,1,4,1,2,1
782
+ 0,2,30,4,2,8386,1,4,2,3,1,2,2,49,3,2,1,3,1,1,1
783
+ 0,1,24,3,3,1024,1,2,4,4,1,4,1,48,2,2,1,3,1,1,1
784
+ 0,2,36,2,0,14318,1,5,4,3,1,2,4,57,3,3,1,4,1,2,1
785
+ 0,2,6,1,6,433,4,2,4,2,1,2,2,24,1,1,1,3,2,1,1
786
+ 0,1,12,1,3,2149,1,3,4,1,1,1,4,29,3,3,1,3,1,1,1
787
+ 0,4,24,2,3,2397,3,5,3,3,1,2,3,35,1,2,2,3,1,2,1
788
+ 0,2,6,1,0,931,2,2,1,2,1,1,2,32,2,2,1,2,1,1,1
789
+ 0,2,15,3,5,1512,4,3,3,4,1,3,2,61,2,2,2,3,1,1,1
790
+ 0,2,24,0,9,4241,1,3,1,3,1,4,1,36,3,2,3,2,1,2,1
791
+ 0,2,24,4,2,4736,1,2,2,2,1,4,3,25,1,2,1,2,1,1,1
792
+ 0,2,15,0,0,1778,1,2,2,2,1,1,1,26,3,1,2,1,1,1,1
793
+ 0,3,15,2,3,2327,1,2,2,2,1,3,1,25,3,2,1,2,1,1,1
794
+ 0,1,24,1,2,6872,1,2,2,1,1,1,2,55,1,2,1,3,1,2,1
795
+ 0,1,12,2,6,795,1,2,4,2,1,4,2,53,3,2,1,3,1,1,1
796
+ 0,3,30,3,9,1908,1,5,4,3,1,4,1,66,3,2,1,4,1,2,1
797
+ 0,2,36,0,9,1953,1,5,4,3,1,4,4,61,3,3,1,4,1,2,1
798
+ 0,3,18,2,2,2864,1,3,2,3,1,1,1,34,3,2,1,2,2,1,1
799
+ 0,3,21,4,6,2319,1,2,2,1,1,1,3,33,3,1,1,3,1,1,1
800
+ 0,1,24,2,0,915,5,5,4,2,1,2,3,29,1,2,1,3,1,1,1
801
+ 0,3,24,2,0,947,1,4,4,3,1,3,4,38,1,3,1,3,2,1,1
802
+ 0,1,24,2,0,1381,5,3,4,2,1,2,2,35,3,2,1,3,1,1,1
803
+ 0,1,24,2,0,1285,5,4,4,2,1,4,4,32,3,1,1,3,1,1,1
804
+ 0,1,24,2,0,1371,5,3,4,2,1,4,1,25,3,1,1,3,1,1,1
805
+ 0,2,18,2,0,1042,5,3,4,2,1,2,2,33,3,2,1,3,1,1,1
806
+ 0,1,12,2,0,900,5,3,4,4,1,2,3,23,3,2,1,3,1,1,1
807
+ 0,1,24,2,0,1207,1,2,4,2,1,4,2,24,3,1,1,3,1,1,1
808
+ 0,2,18,0,0,2278,2,2,3,2,1,3,3,28,3,2,2,3,1,1,1
809
+ 0,1,60,3,9,6836,1,5,3,3,1,4,4,63,3,2,2,3,1,2,1
810
+ 0,1,24,2,2,3345,1,5,4,3,1,2,2,39,3,1,1,4,1,2,1
811
+ 0,1,6,1,6,1198,1,5,4,2,1,4,4,35,3,3,1,3,1,1,1
812
+ 0,2,48,2,9,15672,1,3,2,3,1,2,3,23,3,2,1,3,1,2,1
813
+ 0,1,60,2,9,7297,1,5,4,3,2,4,4,36,3,1,1,3,1,1,1
814
+ 0,4,18,2,5,1943,1,2,4,2,1,4,1,23,3,2,1,3,1,1,1
815
+ 0,1,18,2,3,3190,1,3,2,2,1,2,1,24,3,2,1,3,1,1,1
816
+ 0,2,9,1,1,5129,1,5,2,2,1,4,4,74,1,3,1,4,2,2,1
817
+ 0,4,18,3,2,1808,1,4,4,2,1,1,1,22,3,2,1,3,1,1,1
818
+ 0,3,10,2,0,1240,2,5,1,2,1,4,4,48,3,3,1,2,2,1,1
819
+ 0,1,12,2,0,759,1,4,4,3,1,2,1,26,3,2,1,3,1,1,1
820
+ 0,2,8,2,2,1237,1,3,3,2,1,4,1,24,3,2,1,3,1,1,1
821
+ 0,4,9,2,2,1980,1,2,2,2,2,2,3,19,3,1,2,3,1,1,1
822
+ 0,2,48,2,3,10961,4,4,1,3,2,2,4,27,1,2,2,3,1,2,1
823
+ 0,1,36,3,6,6887,1,3,4,3,1,3,2,29,2,2,1,3,1,2,1
824
+ 0,1,24,2,3,1938,1,2,4,1,1,3,2,32,3,2,1,3,1,1,1
825
+ 0,1,21,2,3,1835,1,3,3,2,1,2,1,25,3,2,2,3,1,2,1
826
+ 0,1,24,3,3,1659,1,2,4,2,1,2,3,29,3,1,1,2,1,2,1
827
+ 0,2,6,3,0,1209,1,1,4,3,1,4,2,47,3,2,1,4,1,2,1
828
+ 0,2,48,0,9,3844,2,4,4,3,1,4,4,34,3,3,1,2,2,1,1
829
+ 0,1,12,4,0,4843,1,5,3,3,2,4,2,43,3,1,2,3,1,2,1
830
+ 0,2,12,2,5,639,1,3,4,3,1,2,3,30,3,2,1,3,1,1,1
831
+ 0,2,48,2,3,5951,1,3,2,2,1,2,1,22,3,2,1,3,1,1,1
832
+ 0,2,36,0,3,3804,1,3,4,2,1,1,3,42,3,2,1,3,1,2,1
833
+ 0,4,36,3,3,4463,1,3,4,3,1,2,3,26,3,2,2,4,1,2,1
834
+ 0,4,36,3,9,7980,5,2,4,3,1,4,3,27,3,1,2,3,1,2,1
835
+ 0,3,36,2,3,4210,1,3,4,3,1,2,3,26,3,2,1,3,1,1,1
836
+ 0,4,6,2,2,4611,1,2,1,2,1,4,2,32,3,2,1,3,1,1,1
837
+ 0,2,24,2,1,11560,1,3,1,2,1,4,3,23,3,1,2,4,1,1,1
838
+ 0,4,18,0,9,4165,1,3,2,3,1,2,3,36,2,2,2,3,2,1,1
839
+ 0,2,24,2,2,4057,1,4,3,1,1,3,3,43,3,2,1,3,1,2,1
840
+ 0,4,18,1,0,6458,1,5,2,3,1,4,4,39,1,2,2,4,2,2,1
841
+ 0,4,12,2,0,1386,3,3,2,2,1,2,2,26,3,2,1,3,1,1,1
842
+ 0,1,36,2,6,1977,5,5,4,3,1,4,4,40,3,2,1,4,1,2,1
843
+ 0,2,18,4,2,1928,1,2,2,3,1,2,1,31,3,2,2,2,1,1,1
844
+ 0,4,12,2,2,1123,3,3,4,2,1,4,3,29,3,1,1,2,1,1,1
845
+ 0,2,24,2,10,11328,1,3,2,3,2,3,3,29,1,2,2,4,1,2,1
846
+ 0,2,24,4,10,11938,1,3,2,3,2,3,3,39,3,2,2,4,2,2,1
847
+ 0,2,27,4,3,2520,3,3,4,3,1,2,2,23,3,2,2,2,1,1,1
848
+ 0,2,30,3,3,1919,2,2,4,3,1,3,4,30,2,2,2,4,1,1,1
849
+ 0,2,60,1,10,14782,2,5,3,2,1,4,4,60,1,3,2,4,1,2,1
850
+ 0,2,36,2,3,2671,2,3,4,2,2,4,4,50,3,3,1,3,1,1,1
851
+ 0,2,36,2,6,12612,2,3,1,3,1,4,4,47,3,3,1,3,2,2,1
852
+ 0,2,45,2,3,3031,2,3,4,3,3,4,2,21,3,1,1,3,1,1,1
853
+ 0,1,12,1,3,626,1,3,4,2,1,4,1,24,1,2,1,2,1,1,1
854
+ 0,2,24,4,9,1935,1,5,4,1,1,4,1,31,3,2,2,3,1,2,1
855
+ 0,3,24,4,0,1344,5,4,4,3,1,2,1,37,1,2,2,2,2,1,1
856
+ 0,4,18,2,2,1533,1,2,4,4,2,1,2,43,3,2,1,2,2,1,1
857
+ 0,1,48,2,0,3931,1,4,4,3,1,4,4,46,3,3,1,3,2,1,1
858
+ 0,1,24,1,2,3349,3,2,4,3,1,4,4,30,3,3,1,3,2,2,1
859
+ 0,1,36,2,3,2302,1,3,4,1,1,4,3,31,3,1,1,3,1,1,1
860
+ 0,1,42,2,3,3965,1,2,4,3,1,3,3,34,3,2,1,3,1,1,1
861
+ 0,1,12,2,3,727,2,2,4,4,1,3,4,33,3,2,1,2,1,2,1
862
+ 0,4,48,2,9,3914,5,3,4,1,1,2,1,38,1,2,1,3,1,1,1
863
+ 0,1,48,2,9,4308,1,2,3,2,1,4,2,24,3,1,1,3,1,1,1
864
+ 0,2,12,2,3,1534,1,2,1,4,1,1,1,23,3,1,1,3,1,1,1
865
+ 0,4,18,4,0,2775,1,4,2,3,1,2,2,31,1,2,2,3,1,1,1
866
+ 0,1,40,4,6,5998,1,3,4,3,1,3,4,27,1,2,1,3,1,2,1
867
+ 0,3,15,4,3,1271,5,3,3,3,1,4,4,39,3,3,2,3,1,2,1
868
+ 0,2,12,2,0,1295,1,2,3,2,1,1,3,25,3,1,1,3,1,1,1
869
+ 0,2,36,2,1,9398,1,2,1,4,1,4,3,28,3,1,1,4,1,2,1
870
+ 0,2,12,2,2,951,2,2,4,2,1,4,3,27,1,1,4,3,1,1,1
871
+ 0,2,24,2,0,1355,1,2,3,2,1,4,3,25,3,2,1,2,1,2,1
872
+ 0,1,48,2,4,3051,1,3,3,3,1,4,3,54,3,2,1,3,1,1,1
873
+ 0,4,36,4,0,7855,1,3,4,2,1,2,1,25,2,2,2,3,1,2,1
874
+ 0,4,18,2,3,433,1,1,3,2,2,4,1,22,3,1,1,3,1,1,1
875
+ 0,4,36,3,9,9572,1,2,1,1,1,1,3,28,3,2,2,3,1,1,1
876
+ 0,2,24,1,6,1837,1,4,4,2,1,4,4,34,1,3,1,2,1,1,1
877
+ 0,2,30,4,0,4249,1,1,4,4,1,2,3,28,3,2,2,4,1,1,1
878
+ 0,2,30,4,0,5234,1,1,4,4,1,2,3,28,3,2,2,4,1,1,1
879
+ 0,1,48,2,3,6758,1,3,3,2,1,2,3,31,3,2,1,3,1,2,1
880
+ 0,1,9,2,3,1366,1,2,3,2,1,4,2,22,3,1,1,3,1,1,1
881
+ 0,1,24,1,10,1358,5,5,4,3,1,3,3,40,2,2,1,4,1,2,1
882
+ 0,1,18,2,2,2473,1,1,4,3,1,1,3,25,3,2,1,1,1,1,1
883
+ 0,3,9,0,3,1337,1,2,4,3,1,2,3,34,3,2,2,4,1,2,1
884
+ 0,1,48,2,0,7763,1,5,4,3,1,4,4,42,1,3,1,4,1,1,1
885
+ 0,2,15,1,0,1264,2,3,2,4,1,2,2,25,3,1,1,3,1,1,1
886
+ 0,2,15,2,0,2631,2,3,2,2,1,4,3,28,3,1,2,3,1,2,1
887
+ 0,2,48,2,0,6560,2,4,3,3,1,2,2,24,3,2,1,3,1,1,1
888
+ 0,1,24,2,0,3123,1,2,4,2,1,1,2,27,3,2,1,3,1,1,1
889
+ 0,1,36,4,6,8065,1,3,3,2,1,2,4,25,3,2,2,4,1,2,1
890
+ 0,1,24,2,3,2439,1,2,4,2,1,4,1,35,3,2,1,3,1,2,1
891
+ 0,2,36,2,2,9034,2,2,4,3,2,1,4,29,3,1,1,4,1,2,1
892
+ 0,2,60,2,0,14027,1,4,4,3,1,2,4,27,3,2,1,4,1,2,1
893
+ 0,1,36,4,1,9629,1,4,4,3,1,4,3,24,3,2,2,3,1,2,1
894
+ 0,2,12,2,3,1484,5,3,2,4,1,1,1,25,3,2,1,3,1,2,1
895
+ 0,1,18,2,2,1131,1,1,4,2,1,2,3,33,3,2,1,3,1,1,1
896
+ 0,2,24,3,2,2064,1,1,3,2,1,2,2,34,3,2,1,4,1,2,1
897
+ 0,2,18,2,1,12976,1,1,3,2,1,4,4,38,3,3,1,4,1,2,1
898
+ 0,4,21,3,9,2580,3,2,4,3,1,2,1,41,1,2,1,2,2,1,1
899
+ 0,4,27,2,0,2570,1,3,3,2,1,3,1,21,3,1,1,3,1,1,1
900
+ 0,2,27,2,9,3915,1,3,4,3,1,2,3,36,3,2,1,3,2,2,1
901
+ 0,4,10,2,0,1309,5,3,4,3,3,4,2,27,3,2,1,2,1,1,1
902
+ 0,1,24,2,0,4817,1,4,2,3,2,3,2,31,3,2,1,3,1,2,1
903
+ 0,1,12,2,0,2579,1,2,4,3,1,1,1,33,3,2,1,2,2,1,1
904
+ 0,2,36,3,0,2225,1,5,4,3,1,4,4,57,1,3,2,3,1,2,1
905
+ 0,1,18,2,2,4153,1,3,2,3,2,3,3,42,3,2,1,3,1,1,1
906
+ 0,1,18,0,2,3114,1,2,1,2,1,4,2,26,3,1,1,3,1,1,1
907
+ 0,1,18,4,2,2124,1,3,4,2,1,4,1,24,3,1,2,3,1,1,1
908
+ 0,1,18,1,2,1553,1,3,4,3,1,3,3,44,1,2,1,3,1,1,1
909
+ 0,1,30,2,2,2406,1,4,4,2,1,4,1,23,3,1,1,3,1,1,1
910
+ 0,1,24,3,0,1333,1,1,4,3,1,2,1,43,3,3,2,3,2,1,1
911
+ 0,1,48,0,2,7119,1,3,3,3,1,4,4,53,3,3,2,3,2,1,1
912
+ 0,1,24,3,0,4870,1,3,3,3,1,4,4,53,3,3,2,3,2,1,1
913
+ 0,1,12,4,0,691,1,5,4,3,1,3,2,35,3,2,2,3,1,1,1
914
+ 0,1,42,3,3,4370,1,4,3,3,1,2,2,26,1,2,2,3,2,2,1
915
+ 0,1,36,1,2,2746,1,5,4,3,1,4,3,31,1,2,1,3,1,1,1
916
+ 0,1,24,0,2,4110,1,5,3,3,1,4,4,23,1,1,2,3,2,1,1
917
+ 0,1,18,2,2,2462,1,3,2,3,1,2,3,22,3,2,1,3,1,1,1
918
+ 0,1,12,2,2,1282,1,3,2,2,1,4,3,20,3,1,1,3,1,1,1
919
+ 0,2,12,0,2,2969,1,2,4,2,1,3,2,25,3,1,2,3,1,1,1
920
+ 0,1,48,0,1,4605,1,5,3,3,1,4,4,24,3,3,2,3,2,1,1
921
+ 0,1,48,4,1,6331,1,5,4,3,1,4,4,46,3,3,2,3,1,2,1
922
+ 0,1,24,1,2,3552,1,4,3,3,1,4,3,27,1,2,1,3,1,1,1
923
+ 0,1,12,1,0,697,1,2,4,3,1,2,3,46,1,2,2,3,1,2,1
924
+ 0,1,24,2,0,1442,1,4,4,2,1,4,3,23,3,1,2,3,1,1,1
925
+ 0,1,27,0,9,5293,1,1,2,3,1,4,2,50,3,2,2,3,1,2,1
926
+ 0,1,21,3,6,3414,1,2,2,3,1,1,2,26,2,2,2,3,1,1,1
927
+ 0,1,18,2,2,2039,1,3,1,2,1,4,1,20,3,1,1,3,1,1,1
928
+ 0,1,24,1,9,3161,1,3,4,3,1,2,2,31,1,1,1,3,1,2,1
929
+ 0,1,12,2,8,902,1,4,4,4,1,4,2,21,3,1,1,3,1,1,1
930
+ 0,1,48,2,1,10297,1,4,4,3,1,4,4,39,3,3,3,3,2,2,1
931
+ 0,2,48,0,9,14421,1,3,2,3,1,2,3,25,2,2,1,3,1,2,1
932
+ 0,2,18,4,0,1056,1,5,3,3,3,3,1,30,3,2,2,3,1,1,1
933
+ 0,1,12,2,0,1274,1,2,3,2,1,1,1,37,1,2,1,2,1,1,1
934
+ 0,2,12,2,0,1223,1,5,1,1,1,1,1,46,3,1,2,3,1,1,1
935
+ 0,1,12,2,0,1372,1,4,2,1,1,3,3,36,3,2,1,3,1,1,1
936
+ 0,1,16,4,0,2625,1,5,2,3,3,4,2,43,3,1,1,3,1,2,2
937
+ 0,1,20,4,0,2235,1,3,4,4,3,2,2,33,1,1,2,3,1,1,2
938
+ 0,2,9,2,2,959,1,3,1,2,1,2,3,29,1,2,1,3,1,1,1
939
+ 0,2,18,4,0,884,1,5,4,3,1,4,3,36,3,2,1,3,2,2,1
940
+ 0,2,24,2,0,1246,1,2,4,3,1,2,1,23,1,2,1,2,1,1,1
941
+ 0,2,36,3,0,8086,2,5,2,3,1,4,3,42,2,2,4,4,1,2,1
942
+ 0,4,48,4,0,10127,3,3,2,3,1,2,4,44,3,3,1,3,1,1,1
943
+ 0,2,12,2,0,888,1,5,4,3,1,4,3,41,1,2,1,2,2,1,1
944
+ 0,4,12,2,6,719,1,5,4,3,1,4,3,41,1,2,1,2,2,1,1
945
+ 0,2,36,2,0,12389,5,3,1,3,1,4,4,37,1,3,1,3,1,2,1
946
+ 0,1,12,2,3,709,1,5,4,3,1,4,1,57,3,2,1,2,1,1,1
947
+ 0,2,15,1,0,6850,2,1,1,3,1,2,2,34,2,2,1,4,2,2,1
948
+ 0,4,10,2,2,2210,1,3,2,3,1,2,1,25,3,1,1,2,1,1,1
949
+ 0,4,30,1,1,7485,5,1,4,2,1,1,1,53,1,2,1,4,1,2,1
950
+ 0,1,18,1,0,1442,1,4,4,3,1,4,4,32,1,3,2,2,2,1,1
951
+ 0,4,12,4,3,797,5,5,4,2,1,3,2,33,3,2,1,2,2,1,1
952
+ 0,2,45,4,3,4746,1,2,4,3,1,2,2,24,1,2,2,2,1,1,1
953
+ 0,3,12,4,0,939,3,4,4,4,1,2,1,28,3,2,3,3,1,2,1
954
+ 0,2,21,2,9,1188,1,5,2,2,1,4,2,39,3,2,1,3,2,1,1
955
+ 0,4,48,4,1,11590,2,3,2,2,1,4,3,24,3,1,2,2,1,1,1
956
+ 0,3,12,1,9,609,1,2,4,2,1,1,1,26,1,2,1,1,1,1,1
957
+ 0,1,18,4,5,1190,1,1,2,2,1,4,4,55,3,3,3,1,2,1,1
958
+ 0,2,21,2,9,2767,2,5,4,1,1,2,3,61,3,1,2,2,1,1,1
959
+ 0,2,30,2,2,3441,2,3,2,2,2,4,3,21,1,1,1,3,1,1,1
960
+ 0,2,30,0,9,4280,2,3,4,2,1,4,3,26,3,1,2,2,1,1,1
961
+ 0,2,24,2,3,3092,2,2,3,4,1,2,3,22,3,1,1,3,1,2,1
962
+ 0,4,18,2,0,6761,5,3,2,3,1,4,3,68,2,1,2,3,1,1,1
963
+ 0,2,12,2,3,1331,1,2,2,3,1,1,3,22,3,2,1,3,1,1,1
964
+ 0,2,54,0,9,15945,1,2,3,3,1,4,4,58,3,1,1,3,1,2,1
965
+ 0,1,24,2,2,3234,1,2,4,2,1,4,1,23,3,1,1,2,1,2,1
966
+ 0,2,15,2,3,802,1,5,4,3,1,3,3,37,3,2,1,3,2,1,1
967
+ 0,2,48,2,2,9960,1,2,1,2,1,2,3,26,1,2,1,3,1,2,1
968
+ 0,4,24,3,9,8648,1,2,2,3,1,2,3,27,1,2,2,3,1,2,1
969
+ 0,1,18,2,3,1345,1,3,4,4,1,3,1,26,3,2,1,3,1,1,1
970
+ 0,1,45,2,3,1845,1,3,4,3,1,4,4,23,3,3,1,3,1,2,1
971
+ 0,1,21,1,0,1647,5,3,4,3,1,2,2,40,1,2,2,2,2,1,1
972
+ 0,4,48,2,9,4844,1,1,3,3,1,2,3,33,3,1,1,4,1,2,1
973
+ 0,2,27,0,9,8318,1,5,2,2,1,4,4,42,2,3,2,4,1,2,1
974
+ 0,3,18,2,3,2100,1,3,4,3,2,2,1,37,3,2,1,3,1,1,1
975
+ 0,1,45,0,9,11816,1,5,2,3,1,4,3,29,3,1,2,3,1,1,1
976
+ 0,1,6,2,6,448,1,2,4,2,1,4,2,23,3,2,1,3,1,1,1
977
+ 0,1,30,2,5,11998,1,2,1,1,1,1,4,34,1,2,1,2,1,2,1
978
+ 0,2,48,0,10,18424,1,3,1,2,1,2,2,32,1,2,1,4,1,2,2
979
+ 0,1,6,2,0,14896,1,5,1,3,1,4,4,68,1,2,1,4,1,2,1
980
+ 0,2,12,2,2,2762,5,5,1,2,1,2,2,25,3,2,1,3,1,2,1
981
+ 0,1,12,2,1,3386,1,5,3,3,1,4,4,35,3,3,1,3,1,2,1
982
+ 0,2,24,2,3,2039,1,2,1,4,1,1,2,22,3,2,1,3,1,2,1
983
+ 0,4,18,3,9,2169,1,3,4,4,1,2,3,28,3,2,1,3,1,2,1
984
+ 0,2,48,4,2,5096,1,3,2,2,1,3,3,30,3,2,1,4,1,2,1
985
+ 0,1,18,2,3,1882,1,3,4,2,1,4,3,25,1,1,2,3,1,1,1
986
+ 0,1,48,2,3,6999,1,4,1,4,3,1,1,34,3,2,2,3,1,2,1
987
+ 0,4,12,4,9,2292,1,1,4,3,1,2,3,42,2,2,2,4,1,2,1
988
+ 0,1,14,2,0,8978,1,5,1,1,1,4,2,45,3,2,1,4,1,2,2
989
+ 0,1,12,2,3,674,2,4,4,4,1,1,2,20,3,2,1,3,1,1,1
990
+ 0,1,18,2,0,976,1,2,1,2,1,2,3,23,3,2,1,2,1,1,1
991
+ 0,2,24,2,0,2718,1,3,3,2,1,4,2,20,3,1,1,2,1,2,1
992
+ 0,1,18,2,6,750,1,1,4,2,1,1,1,27,3,2,1,1,1,1,1
993
+ 0,2,24,2,1,12579,1,5,4,2,1,2,4,44,3,3,1,4,1,2,1
994
+ 0,1,18,2,1,7511,5,5,1,3,1,4,2,51,3,3,1,3,2,2,1
995
+ 0,1,18,4,0,3966,1,5,1,2,1,4,1,33,1,1,3,3,1,2,1
996
+ 0,1,12,0,3,6199,1,3,4,3,1,2,2,28,3,1,2,3,1,2,1
997
+ 0,1,24,2,3,1987,1,3,2,3,1,4,1,21,3,1,1,2,2,1,1
998
+ 0,1,24,2,0,2303,1,5,4,3,2,1,1,45,3,2,1,3,1,1,1
999
+ 0,4,21,4,0,12680,5,5,4,3,1,4,4,30,3,3,1,4,1,2,1
1000
+ 0,2,12,2,3,6468,5,1,2,3,1,1,4,52,3,2,1,4,1,2,1
1001
+ 0,1,30,2,2,6350,5,5,4,3,1,4,2,31,3,2,1,3,1,1,1
data/raw/german_credit_description.xlsx ADDED
Binary file (14.2 kB). View file
 
model/model.joblib ADDED
Binary file (6.01 kB). View file
 
model/model.pickle ADDED
Binary file (5.68 kB). View file
 
notebooks/german_credit_modeling.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
reports/metrics.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "accuracy": 0.71,
3
+ "precision": 0.7887,
4
+ "recall": 0.8,
5
+ "f1_score": 0.7943,
6
+ "roc_auc": 0.7533
7
+ }
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ pandas==1.5.3
2
+ plotly==5.14.1
3
+ scikit-learn==1.1.2
4
+ gradio==3.24.1
scripts/evaluate_model.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Quick report command for credit risk model metrics."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from pathlib import Path
7
+
8
+ PROJECT_ROOT = Path(__file__).resolve().parents[1]
9
+ METRICS_PATH = PROJECT_ROOT / "reports" / "metrics.json"
10
+
11
+
12
+ def main() -> None:
13
+ """Print persisted metrics in a clean terminal format."""
14
+ if not METRICS_PATH.exists():
15
+ raise FileNotFoundError(
16
+ "Metrics file not found. Run `python scripts/train_model.py` first."
17
+ )
18
+
19
+ metrics = json.loads(METRICS_PATH.read_text(encoding="utf-8"))
20
+ print("Credit Risk Metrics")
21
+ for key, value in metrics.items():
22
+ print(f"- {key}: {value}")
23
+
24
+
25
+ if __name__ == "__main__":
26
+ main()
27
+
scripts/train_model.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Train and persist the credit risk model and evaluation artifacts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+ import pickle
7
+ from pathlib import Path
8
+
9
+ import pandas as pd
10
+ from sklearn.model_selection import train_test_split
11
+
12
+ PROJECT_ROOT = Path(__file__).resolve().parents[1]
13
+ sys.path.insert(0, str(PROJECT_ROOT / "src"))
14
+
15
+ from credit_risk.config import DATA_PROCESSED_DIR, DATA_RAW_PATH, MODEL_DIR, REPORTS_DIR
16
+ from credit_risk.features import build_training_frame
17
+ from credit_risk.modeling import evaluate_model, save_metrics, save_model, train_model
18
+
19
+
20
+ def main() -> None:
21
+ """Main training flow used by local runs and CI validations."""
22
+ raw_df = pd.read_csv(DATA_RAW_PATH)
23
+ features, target = build_training_frame(raw_df)
24
+
25
+ # Stratification preserves class balance between train and test sets.
26
+ x_train, x_test, y_train, y_test = train_test_split(
27
+ features,
28
+ target,
29
+ test_size=0.3,
30
+ random_state=42,
31
+ stratify=target,
32
+ )
33
+
34
+ model = train_model(x_train=x_train, y_train=y_train, random_state=42)
35
+ metrics, y_hat = evaluate_model(model=model, x_test=x_test, y_test=y_test)
36
+
37
+ DATA_PROCESSED_DIR.mkdir(parents=True, exist_ok=True)
38
+ x_train.to_parquet(DATA_PROCESSED_DIR / "x_train.parquet", index=False)
39
+ x_test.to_parquet(DATA_PROCESSED_DIR / "x_test.parquet", index=False)
40
+ y_train.to_frame(name="target").to_parquet(DATA_PROCESSED_DIR / "y_train.parquet", index=False)
41
+ y_test.to_frame(name="target").to_parquet(DATA_PROCESSED_DIR / "y_test.parquet", index=False)
42
+ y_hat.to_frame(name="prediction").to_parquet(DATA_PROCESSED_DIR / "yhat.parquet", index=False)
43
+
44
+ save_model(model=model, model_path=MODEL_DIR / "model.joblib")
45
+ # Backward-compatible artifact used by the existing Gradio Space app.
46
+ with (MODEL_DIR / "model.pickle").open("wb") as file:
47
+ pickle.dump(model, file)
48
+ save_metrics(metrics=metrics, path=REPORTS_DIR / "metrics.json")
49
+
50
+ print("Training finished successfully.")
51
+ print(f"Saved model to: {MODEL_DIR / 'model.joblib'}")
52
+ print(f"Saved metrics to: {REPORTS_DIR / 'metrics.json'}")
53
+
54
+
55
+ if __name__ == "__main__":
56
+ main()
src/credit_risk/__init__.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ """Core package for the credit risk classification project."""
2
+
src/credit_risk/__pycache__/__init__.cpython-313.pyc DELETED
Binary file (342 Bytes)
 
src/credit_risk/__pycache__/config.cpython-313.pyc DELETED
Binary file (5.23 kB)
 
src/credit_risk/__pycache__/features.cpython-313.pyc DELETED
Binary file (2.93 kB)
 
src/credit_risk/__pycache__/modeling.cpython-313.pyc DELETED
Binary file (3.26 kB)
 
src/credit_risk/app_support.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """App-side helpers to load artifacts and build visual outputs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import pickle
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ import joblib
12
+ import pandas as pd
13
+ import plotly.express as px
14
+ import plotly.graph_objects as go
15
+ from sklearn.metrics import confusion_matrix
16
+
17
+ from credit_risk.config import MODEL_DIR, REPORTS_DIR, SELECTED_FEATURES
18
+
19
+
20
+ @dataclass
21
+ class AppArtifacts:
22
+ """Objects loaded once at startup to keep app latency low."""
23
+
24
+ model: Any
25
+ metrics: dict[str, float]
26
+ feature_importance_plot: go.Figure
27
+ confusion_matrix_plot: go.Figure
28
+
29
+
30
+ def _load_model() -> Any:
31
+ """Load the most recent model artifact with backward-compatible fallback."""
32
+ joblib_path = MODEL_DIR / "model.joblib"
33
+ legacy_pickle_path = MODEL_DIR / "model.pickle"
34
+
35
+ if joblib_path.exists():
36
+ return joblib.load(joblib_path)
37
+
38
+ if legacy_pickle_path.exists():
39
+ with legacy_pickle_path.open("rb") as file:
40
+ return pickle.load(file)
41
+
42
+ raise FileNotFoundError(
43
+ "No model artifact found. Run `python scripts/train_model.py` first."
44
+ )
45
+
46
+
47
+ def _load_metrics() -> dict[str, float]:
48
+ """Load cached metrics, or return an empty dict when not available."""
49
+ metrics_path = REPORTS_DIR / "metrics.json"
50
+ if not metrics_path.exists():
51
+ return {}
52
+ return json.loads(metrics_path.read_text(encoding="utf-8"))
53
+
54
+
55
+ def _load_test_outputs() -> tuple[pd.Series | None, pd.Series | None]:
56
+ """Load y_test and yhat predictions used to generate confusion matrix."""
57
+ y_test_path = Path("data") / "processed" / "y_test.parquet"
58
+ y_hat_path = Path("data") / "processed" / "yhat.parquet"
59
+
60
+ if not y_test_path.exists() or not y_hat_path.exists():
61
+ return None, None
62
+
63
+ y_test = pd.read_parquet(y_test_path).squeeze()
64
+ y_hat = pd.read_parquet(y_hat_path).squeeze()
65
+ return y_test, y_hat
66
+
67
+
68
+ def _build_feature_importance_plot(model: Any) -> go.Figure:
69
+ """Build a robust plot even when the estimator has no feature_importances_."""
70
+ if hasattr(model, "feature_importances_"):
71
+ importances = pd.Series(model.feature_importances_, index=SELECTED_FEATURES)
72
+ data = (
73
+ importances.sort_values(ascending=False)
74
+ .rename_axis("feature")
75
+ .reset_index(name="importance")
76
+ )
77
+ return px.bar(
78
+ data,
79
+ x="feature",
80
+ y="importance",
81
+ title="Feature Importance",
82
+ labels={"feature": "Feature", "importance": "Importance"},
83
+ )
84
+
85
+ return go.Figure(
86
+ layout={
87
+ "title": "Feature importance is not available for this model type.",
88
+ "xaxis_title": "Feature",
89
+ "yaxis_title": "Importance",
90
+ }
91
+ )
92
+
93
+
94
+ def _build_confusion_matrix_plot(y_test: pd.Series | None, y_hat: pd.Series | None) -> go.Figure:
95
+ """Build confusion matrix from cached test predictions."""
96
+ if y_test is None or y_hat is None:
97
+ return go.Figure(
98
+ layout={
99
+ "title": "Confusion matrix not available yet. Run training script first.",
100
+ "xaxis_title": "Predicted",
101
+ "yaxis_title": "Actual",
102
+ }
103
+ )
104
+
105
+ matrix = confusion_matrix(y_test, y_hat)
106
+ return px.imshow(
107
+ matrix,
108
+ x=["Predicted 0", "Predicted 1"],
109
+ y=["Actual 0", "Actual 1"],
110
+ color_continuous_scale="Blues",
111
+ text_auto=True,
112
+ labels={"x": "Predicted", "y": "Actual", "color": "Count"},
113
+ title="Confusion Matrix",
114
+ )
115
+
116
+
117
+ def format_metrics_markdown(metrics: dict[str, float]) -> str:
118
+ """Render metrics consistently in the UI."""
119
+ if not metrics:
120
+ return "Metrics not available. Run `python scripts/train_model.py` first."
121
+
122
+ lines = ["### Model Metrics"]
123
+ for key, value in metrics.items():
124
+ metric_name = key.replace("_", " ").title()
125
+ lines.append(f"- **{metric_name}:** {value:.4f}")
126
+ return "\n".join(lines)
127
+
128
+
129
+ def load_artifacts() -> AppArtifacts:
130
+ """Entry point used by the app to pre-load model and visual assets once."""
131
+ model = _load_model()
132
+ metrics = _load_metrics()
133
+ y_test, y_hat = _load_test_outputs()
134
+
135
+ return AppArtifacts(
136
+ model=model,
137
+ metrics=metrics,
138
+ feature_importance_plot=_build_feature_importance_plot(model),
139
+ confusion_matrix_plot=_build_confusion_matrix_plot(y_test, y_hat),
140
+ )
141
+
src/credit_risk/config.py ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Project-wide constants and feature configuration for credit risk."""
2
+
3
+ from dataclasses import dataclass
4
+ from pathlib import Path
5
+
6
+ PROJECT_ROOT = Path(__file__).resolve().parents[2]
7
+ DATA_RAW_PATH = PROJECT_ROOT / "data" / "raw" / "german_credit.csv"
8
+ DATA_PROCESSED_DIR = PROJECT_ROOT / "data" / "processed"
9
+ MODEL_DIR = PROJECT_ROOT / "model"
10
+ REPORTS_DIR = PROJECT_ROOT / "reports"
11
+
12
+ TARGET_COLUMN = "Creditability"
13
+ NOT_SELECTED_LABEL = "Not selected"
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class FeatureOption:
18
+ """Single UI option and its one-hot encoded destination column."""
19
+
20
+ label: str
21
+ column: str
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class FeatureGroup:
26
+ """Feature group used in the app and preprocessing logic."""
27
+
28
+ name: str
29
+ source_column: str
30
+ options: tuple[FeatureOption, ...]
31
+
32
+ @property
33
+ def labels(self) -> list[str]:
34
+ return [option.label for option in self.options]
35
+
36
+ def column_from_label(self, label: str | None) -> str | None:
37
+ if label is None:
38
+ return None
39
+ for option in self.options:
40
+ if option.label == label:
41
+ return option.column
42
+ return None
43
+
44
+
45
+ # This list defines both the app controls and the final model input schema.
46
+ FEATURE_GROUPS: tuple[FeatureGroup, ...] = (
47
+ FeatureGroup(
48
+ name="Account Balance",
49
+ source_column="Account Balance",
50
+ options=(
51
+ FeatureOption("No account", "Account Balance_1"),
52
+ FeatureOption("No balance", "Account Balance_2"),
53
+ FeatureOption("Some balance", "Account Balance_3"),
54
+ ),
55
+ ),
56
+ FeatureGroup(
57
+ name="Payment Status of Previous Credit",
58
+ source_column="Payment Status of Previous Credit",
59
+ options=(
60
+ FeatureOption("Some problems", "Payment Status of Previous Credit_1"),
61
+ FeatureOption("No problems in this bank", "Payment Status of Previous Credit_3"),
62
+ ),
63
+ ),
64
+ FeatureGroup(
65
+ name="Purpose",
66
+ source_column="Purpose",
67
+ options=(
68
+ FeatureOption("New car", "Purpose_1"),
69
+ FeatureOption("Other", "Purpose_4"),
70
+ ),
71
+ ),
72
+ FeatureGroup(
73
+ name="Value Savings/Stocks",
74
+ source_column="Value Savings/Stocks",
75
+ options=(
76
+ FeatureOption("No savings", "Value Savings/Stocks_1"),
77
+ FeatureOption("DM between [100, 1000]", "Value Savings/Stocks_3"),
78
+ FeatureOption("DM >= 1000", "Value Savings/Stocks_5"),
79
+ ),
80
+ ),
81
+ FeatureGroup(
82
+ name="Length of Current Employment",
83
+ source_column="Length of current employment",
84
+ options=(
85
+ FeatureOption("Below 1 year (or unemployed)", "Length of current employment_1"),
86
+ FeatureOption("Between 4 and 7 years", "Length of current employment_4"),
87
+ ),
88
+ ),
89
+ FeatureGroup(
90
+ name="Instalment Per Cent",
91
+ source_column="Instalment per cent",
92
+ options=(FeatureOption("Smaller than 20%", "Instalment per cent_4"),),
93
+ ),
94
+ FeatureGroup(
95
+ name="Guarantors",
96
+ source_column="Guarantors",
97
+ options=(FeatureOption("No guarantors", "Guarantors_1"),),
98
+ ),
99
+ FeatureGroup(
100
+ name="Duration in Current Address",
101
+ source_column="Duration in Current address",
102
+ options=(
103
+ FeatureOption("Less than a year", "Duration in Current address_1"),
104
+ FeatureOption("Between 1 and 4 years", "Duration in Current address_2"),
105
+ ),
106
+ ),
107
+ FeatureGroup(
108
+ name="Most Valuable Available Asset",
109
+ source_column="Most valuable available asset",
110
+ options=(
111
+ FeatureOption("Not available / no assets", "Most valuable available asset_1"),
112
+ FeatureOption("Ownership of house or land", "Most valuable available asset_4"),
113
+ ),
114
+ ),
115
+ FeatureGroup(
116
+ name="Concurrent Credits",
117
+ source_column="Concurrent Credits",
118
+ options=(FeatureOption("No further running credits", "Concurrent Credits_3"),),
119
+ ),
120
+ FeatureGroup(
121
+ name="Type of Apartment",
122
+ source_column="Type of apartment",
123
+ options=(FeatureOption("Free apartment", "Type of apartment_1"),),
124
+ ),
125
+ FeatureGroup(
126
+ name="Number of Credits at this Bank",
127
+ source_column="No of Credits at this Bank",
128
+ options=(FeatureOption("One credit", "No of Credits at this Bank_1"),),
129
+ ),
130
+ FeatureGroup(
131
+ name="Occupation",
132
+ source_column="Occupation",
133
+ options=(FeatureOption("Unemployed or unskilled with no permanent", "Occupation_1"),),
134
+ ),
135
+ )
136
+
137
+
138
+ # Keep this explicit list to guarantee deterministic input order for training/inference.
139
+ SELECTED_FEATURES: list[str] = [
140
+ option.column for group in FEATURE_GROUPS for option in group.options
141
+ ]
142
+
src/credit_risk/features.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Feature preparation utilities for training and app inference."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import pandas as pd
6
+
7
+ from credit_risk.config import FEATURE_GROUPS, SELECTED_FEATURES, TARGET_COLUMN
8
+
9
+
10
+ def _validate_raw_columns(df: pd.DataFrame) -> None:
11
+ """Fail fast when required raw columns are missing."""
12
+ required_columns = {TARGET_COLUMN, *[group.source_column for group in FEATURE_GROUPS]}
13
+ missing = sorted(required_columns.difference(df.columns))
14
+ if missing:
15
+ raise ValueError(f"Missing required columns in raw dataset: {missing}")
16
+
17
+
18
+ def build_training_frame(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.Series]:
19
+ """
20
+ Build the model matrix from the raw CSV.
21
+
22
+ Notes:
23
+ - Uses one-hot encoding only on the columns represented in FEATURE_GROUPS.
24
+ - Reindexes to SELECTED_FEATURES so train/inference always match column order.
25
+ """
26
+ _validate_raw_columns(df)
27
+
28
+ categorical_columns = [group.source_column for group in FEATURE_GROUPS]
29
+ encoded = pd.get_dummies(df[categorical_columns], columns=categorical_columns, dtype="int64")
30
+
31
+ # Guarantee all model columns exist even if a category is absent in the current dataset.
32
+ feature_frame = encoded.reindex(columns=SELECTED_FEATURES, fill_value=0).astype("int64")
33
+ target = df[TARGET_COLUMN].astype("int64")
34
+ return feature_frame, target
35
+
36
+
37
+ def build_inference_frame(selection_by_group: dict[str, str | None]) -> pd.DataFrame:
38
+ """
39
+ Convert app selections to a one-row DataFrame matching model schema.
40
+
41
+ The dict format is:
42
+ {"Account Balance": "No account", "Purpose": None, ...}
43
+ """
44
+ values = {column: 0 for column in SELECTED_FEATURES}
45
+
46
+ for group in FEATURE_GROUPS:
47
+ selected_label = selection_by_group.get(group.name)
48
+ selected_column = group.column_from_label(selected_label)
49
+ if selected_column is not None:
50
+ values[selected_column] = 1
51
+
52
+ return pd.DataFrame([values], columns=SELECTED_FEATURES, dtype="int64")
53
+
src/credit_risk/modeling.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Model training and evaluation helpers for credit risk classification."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from pathlib import Path
7
+
8
+ import joblib
9
+ import pandas as pd
10
+ from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, roc_auc_score
11
+ from sklearn.tree import DecisionTreeClassifier
12
+
13
+
14
+ def train_model(x_train: pd.DataFrame, y_train: pd.Series, random_state: int = 42) -> DecisionTreeClassifier:
15
+ """
16
+ Train a Decision Tree classifier.
17
+
18
+ A tree model keeps parity with the previous project behavior while
19
+ remaining simple to interpret in the app via feature importances.
20
+ """
21
+ model = DecisionTreeClassifier(max_depth=6, min_samples_leaf=12, random_state=random_state)
22
+ model.fit(x_train, y_train)
23
+ return model
24
+
25
+
26
+ def evaluate_model(model: DecisionTreeClassifier, x_test: pd.DataFrame, y_test: pd.Series) -> tuple[dict[str, float], pd.Series]:
27
+ """Return classification metrics and test-set predictions."""
28
+ y_pred = pd.Series(model.predict(x_test), index=y_test.index, name="prediction")
29
+
30
+ metrics = {
31
+ "accuracy": round(float(accuracy_score(y_test, y_pred)), 4),
32
+ "precision": round(float(precision_score(y_test, y_pred, zero_division=0)), 4),
33
+ "recall": round(float(recall_score(y_test, y_pred, zero_division=0)), 4),
34
+ "f1_score": round(float(f1_score(y_test, y_pred, zero_division=0)), 4),
35
+ }
36
+
37
+ # ROC-AUC is only available when the model exposes class probabilities.
38
+ if hasattr(model, "predict_proba"):
39
+ y_score = model.predict_proba(x_test)[:, 1]
40
+ metrics["roc_auc"] = round(float(roc_auc_score(y_test, y_score)), 4)
41
+
42
+ return metrics, y_pred
43
+
44
+
45
+ def save_model(model: DecisionTreeClassifier, model_path: Path) -> None:
46
+ """Persist model as a joblib artifact."""
47
+ model_path.parent.mkdir(parents=True, exist_ok=True)
48
+ joblib.dump(model, model_path)
49
+
50
+
51
+ def save_metrics(metrics: dict[str, float], path: Path) -> None:
52
+ """Persist metrics in JSON for app visualization and reproducibility."""
53
+ path.parent.mkdir(parents=True, exist_ok=True)
54
+ path.write_text(json.dumps(metrics, indent=2), encoding="utf-8")
55
+