load("C:/Users/jessi/Desktop/ML7331_ICA5/titanic2.raw.rdata")
# Number of rows
nrow(titanic.raw)
[1] 2201
# Number of columns
ncol(titanic.raw)
[1] 4
# Or both at once (dimension of the data)
dim(titanic.raw)
[1] 2201 4
# Column names
colnames(titanic.raw)
[1] "Class" "Sex" "Age" "Survived"
# Display the first 6 rows
head(titanic.raw)
summary(titanic.raw)
Class Sex Age Survived
1st :325 Female: 470 Adult:2092 No :1490
2nd :285 Male :1731 Child: 109 Yes: 711
3rd :706
Crew:885
str(titanic.raw)
'data.frame': 2201 obs. of 4 variables:
$ Class : Factor w/ 4 levels "1st","2nd","3rd",..: 3 3 3 3 3 3 3 3 3 3 ...
$ Sex : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
$ Age : Factor w/ 2 levels "Adult","Child": 2 2 2 2 2 2 2 2 2 2 ...
$ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
# Total missing values per column
colSums(is.na(titanic.raw))
Class Sex Age Survived
0 0 0 0
# Alternatively, check if there are any missing values in the entire dataset
any(is.na(titanic.raw))
[1] FALSE
Q.3:
Based on your outputs, here’s a summary of each step’s results and
interpretation:
Step 1: Load the Dataset
The first few rows and structure of the dataset:
Class Sex Age Survived
0 3rd Male Child No
1 3rd Male Child No
2 3rd Male Child No
3 3rd Male Child No
4 3rd Male Child No
Data structure information:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2201 entries, 0 to 2200
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Class 2201 non-null object
1 Sex 2201 non-null object
2 Age 2201 non-null object
3 Survived 2201 non-null object
dtypes: object(4)
memory usage: 68.9+ KB
Summary of each column:
Column Count Unique Top Freq
Class 2201 4 Crew 885
Sex 2201 2 Male 1731
Age 2201 2 Adult 2092
Survived 2201 2 No 1490
Step 2: Summary of Categorical Distributions
The distribution of values in each categorical column:
Class distribution:
Crew 885
3rd 706
1st 325
2nd 285
Sex distribution:
Male 1731
Female 470
Age distribution:
Adult 2092
Child 109
Survived distribution:
No 1490
Yes 711
Step 3: Support Count Calculations
Support count for \(\{1st, \text{Adult, Yes}\}\):
Support count for {1st, Adult, Yes}: 197
This means there are 197 instances in the dataset where the passenger
was in 1st class, was an adult, and survived.
Additional Steps: Calculating Support and Confidence
Based on this support count and assuming a total of 2201 records, we
can now calculate support and confidence.
Support for \(\{1st,
\text{Adult, Yes}\}\): \[
s = \frac{197}{2201} \approx 0.0895 \text{ or } 8.95\%
\]
Support count for \(\{1st, \text{Adult, Yes, Female}\}\): Run
the code for the count of
{1st, Adult, Yes, Female}
Confidence for \(\{1st, \text{Adult, Yes}\} \rightarrow
\{\text{Female}\}\): Calculate confidence using: \[
c = \frac{\sigma(\{1st, \text{Adult, Yes, Female}\})}{\sigma(\{1st,
\text{Adult, Yes}\})}
\]
Q.1 Answer:
Given the dataset size of 2201 records, I calculated
the minimum support count for a minsup threshold of 0.25:
# Total dataset size
total_records = 2201
# Minsup threshold and required support count
minsup_threshold = 0.25
minsup_count = int(minsup_threshold * total_records) # Result is 550
print("Required support count for minsup of 0.25:", minsup_count)
This means an itemset needs a support count of at least
550 to be frequent at this level. Checking this against
the support counts we’ve seen:
{1st, Adult, Yes}
has a support count of
197.
{1st, Adult, Yes, Female}
has a support count of
140.
Since both are below 550, neither itemset meets the minsup threshold
of 0.25, so neither is frequent.
Based on this, I conclude: - No 4-itemsets would be frequent
or maximal at this minsup level, since even the relevant
3-itemsets fall below the required support count.
Q.2 Answer:
- The support count for
{1st, Adult, Yes}
is 197, with a support of
0.0895 or about 8.95% of the
dataset.
- The support count for
{1st, Adult, Yes, Female}
is 140, with a support
of 0.0636 or about 6.36%.
Q.3 Answer:
To calculate the confidence for the rule
{1st, Adult, Yes} → {Female}
, I use the support counts from
previous answers.
Confidence Calculation: \[
\text{Confidence} = \frac{\text{support count of }\{1st, \text{Adult,
Yes, Female}\}}{\text{support count of }\{1st, \text{Adult, Yes}\}} =
\frac{140}{197} \approx 0.7107
\]
So, the confidence for
{1st, Adult, Yes} → {Female}
is about
71.07%. This means that if someone in the dataset is
from 1st class, an adult, and survived, there’s a 71.07% chance they are
female.
Q.4 Answer:
Support Count for minsup Threshold of 0.25:
- With a minsup threshold of 0.25, an itemset needs a support count of
at least 550 (25% of 2201 records) to be considered
frequent.
Frequent Itemsets with minsup = 0.25:
- To be frequent, an itemset must have a support count of 550 or more.
Looking at our support counts:
{1st, Adult, Yes}
has a support count of 197.
{1st, Adult, Yes, Female}
has a support count of
140.
- Since both are below 550, neither meets the minsup
threshold, so they’re not frequent.
Based on the dataset, only very broad categories (like all
No
for Survived
or all Male
for
Sex
) are likely to exceed a support count of 550.
Maximal 4-Itemsets:
- An itemset is maximal if it’s frequent and has no
frequent supersets. Since none of the 4-itemsets reach a support count
of 550, no 4-itemsets are frequent or maximal at this
minsup level.
Q.5 Answer:
- Step 1: Identify Frequent 3-Itemsets
- With a minimum support count of 200, the following 3-itemsets from
the bar graph are frequent:
{Adult, Female, No}
with a support of 1200
{Crew, Male, No}
with a support of 600
{3rd, Male, No}
with a support of 300
- Step 2: Apply the Apriori Principle
- To generate candidate 4-itemsets, I use the apriori principle, which
states that any subset of a frequent itemset must also be frequent. So,
I can only form a 4-itemset if two 3-itemsets share at least two common
attributes.
- Step 3: Attempt to Generate 4-Itemsets
{Adult, Female, No}
and {Crew, Male, No}
don’t share enough attributes to form a valid 4-itemset.
{Crew, Male, No}
and {3rd, Male, No}
differ in the Class
attribute, so they don’t combine into a
frequent 4-itemset.
{Adult, Female, No}
and {3rd, Male, No}
also lack shared attributes, preventing a 4-itemset.
Conclusion
Since none of these frequent 3-itemsets overlap enough to meet the
apriori principle, no candidate 4-itemsets can be
generated that would meet the minsup threshold.
Colab
RPubs
LS0tDQp0aXRsZTogIk1MNzMzMV9JQ0E1XzEzX05vdl8yNDogVGl0YW5pYyBSYXciDQphdXRob3I6ICJKZXNzaWNhIE1jUGhhdWwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KYGBge3J9DQpsb2FkKCJDOi9Vc2Vycy9qZXNzaS9EZXNrdG9wL01MNzMzMV9JQ0E1L3RpdGFuaWMyLnJhdy5yZGF0YSIpDQoNCg0KIyBOdW1iZXIgb2Ygcm93cw0KbnJvdyh0aXRhbmljLnJhdykNCg0KIyBOdW1iZXIgb2YgY29sdW1ucw0KbmNvbCh0aXRhbmljLnJhdykNCg0KIyBPciBib3RoIGF0IG9uY2UgKGRpbWVuc2lvbiBvZiB0aGUgZGF0YSkNCmRpbSh0aXRhbmljLnJhdykNCg0KIyBDb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRpdGFuaWMucmF3KQ0KDQojIERpc3BsYXkgdGhlIGZpcnN0IDYgcm93cw0KaGVhZCh0aXRhbmljLnJhdykNCg0Kc3VtbWFyeSh0aXRhbmljLnJhdykNCg0Kc3RyKHRpdGFuaWMucmF3KQ0KDQojIFRvdGFsIG1pc3NpbmcgdmFsdWVzIHBlciBjb2x1bW4NCmNvbFN1bXMoaXMubmEodGl0YW5pYy5yYXcpKQ0KDQojIEFsdGVybmF0aXZlbHksIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGVudGlyZSBkYXRhc2V0DQphbnkoaXMubmEodGl0YW5pYy5yYXcpKQ0KYGBgDQoNCiMjIyBRLjM6DQoNCkJhc2VkIG9uIHlvdXIgb3V0cHV0cywgaGVyZeKAmXMgYSBzdW1tYXJ5IG9mIGVhY2ggc3RlcCdzIHJlc3VsdHMgYW5kDQppbnRlcnByZXRhdGlvbjoNCg0KIyMjIFN0ZXAgMTogTG9hZCB0aGUgRGF0YXNldA0KDQpUaGUgZmlyc3QgZmV3IHJvd3MgYW5kIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldDoNCg0KYGBgIHBsYWludGV4dA0KICAgQ2xhc3MgICBTZXggICAgQWdlIFN1cnZpdmVkDQowICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQoxICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQoyICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQozICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQo0ICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQpgYGANCg0KRGF0YSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb246DQoNCmBgYCBwbGFpbnRleHQNCjxjbGFzcyAncGFuZGFzLmNvcmUuZnJhbWUuRGF0YUZyYW1lJz4NClJhbmdlSW5kZXg6IDIyMDEgZW50cmllcywgMCB0byAyMjAwDQpEYXRhIGNvbHVtbnMgKHRvdGFsIDQgY29sdW1ucyk6DQogIyAgIENvbHVtbiAgICBOb24tTnVsbCBDb3VudCAgRHR5cGUgDQotLS0gIC0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLSAgLS0tLS0gDQogMCAgIENsYXNzICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMSAgIFNleCAgICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMiAgIEFnZSAgICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMyAgIFN1cnZpdmVkICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQpkdHlwZXM6IG9iamVjdCg0KQ0KbWVtb3J5IHVzYWdlOiA2OC45KyBLQg0KYGBgDQoNClN1bW1hcnkgb2YgZWFjaCBjb2x1bW46DQoNCmBgYCBwbGFpbnRleHQNCiAgICAgICBDb2x1bW4gICBDb3VudCBVbmlxdWUgICAgVG9wICAgICAgRnJlcQ0KICAgICAgIENsYXNzICAgICAyMjAxICAgIDQgICAgIENyZXcgICAgICAgODg1DQogICAgICAgU2V4ICAgICAgIDIyMDEgICAgMiAgICAgTWFsZSAgICAgICAxNzMxDQogICAgICAgQWdlICAgICAgIDIyMDEgICAgMiAgICAgQWR1bHQgICAgICAyMDkyDQogICAgICAgU3Vydml2ZWQgIDIyMDEgICAgMiAgICAgTm8gICAgICAgICAxNDkwDQpgYGANCg0KIyMjIFN0ZXAgMjogU3VtbWFyeSBvZiBDYXRlZ29yaWNhbCBEaXN0cmlidXRpb25zDQoNClRoZSBkaXN0cmlidXRpb24gb2YgdmFsdWVzIGluIGVhY2ggY2F0ZWdvcmljYWwgY29sdW1uOg0KDQpgYGAgcGxhaW50ZXh0DQpDbGFzcyBkaXN0cmlidXRpb246DQogQ3JldyAgICA4ODUNCiAzcmQgICAgIDcwNg0KIDFzdCAgICAgMzI1DQogMm5kICAgICAyODUNCg0KU2V4IGRpc3RyaWJ1dGlvbjoNCiBNYWxlICAgICAgMTczMQ0KIEZlbWFsZSAgICAgNDcwDQoNCkFnZSBkaXN0cmlidXRpb246DQogQWR1bHQgICAgMjA5Mg0KIENoaWxkICAgICAxMDkNCg0KU3Vydml2ZWQgZGlzdHJpYnV0aW9uOg0KIE5vICAgICAxNDkwDQogWWVzICAgICA3MTENCmBgYA0KDQojIyMgU3RlcCAzOiBTdXBwb3J0IENvdW50IENhbGN1bGF0aW9ucw0KDQotICAgKipTdXBwb3J0IGNvdW50IGZvcioqICRcezFzdCwgXHRleHR7QWR1bHQsIFllc31cfSQ6DQoNCiAgICBgYGAgcGxhaW50ZXh0DQogICAgU3VwcG9ydCBjb3VudCBmb3IgezFzdCwgQWR1bHQsIFllc306ICAxOTcNCiAgICBgYGANCg0KVGhpcyBtZWFucyB0aGVyZSBhcmUgMTk3IGluc3RhbmNlcyBpbiB0aGUgZGF0YXNldCB3aGVyZSB0aGUgcGFzc2VuZ2VyDQp3YXMgaW4gMXN0IGNsYXNzLCB3YXMgYW4gYWR1bHQsIGFuZCBzdXJ2aXZlZC4NCg0KIyMjIEFkZGl0aW9uYWwgU3RlcHM6IENhbGN1bGF0aW5nIFN1cHBvcnQgYW5kIENvbmZpZGVuY2UNCg0KQmFzZWQgb24gdGhpcyBzdXBwb3J0IGNvdW50IGFuZCBhc3N1bWluZyBhIHRvdGFsIG9mIDIyMDEgcmVjb3Jkcywgd2UgY2FuDQpub3cgY2FsY3VsYXRlIHN1cHBvcnQgYW5kIGNvbmZpZGVuY2UuDQoNCjEuICAqKlN1cHBvcnQgZm9yKiogJFx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9JDogJCQNCiAgICBzID0gXGZyYWN7MTk3fXsyMjAxfSBcYXBwcm94IDAuMDg5NSBcdGV4dHsgb3IgfSA4Ljk1XCUNCiAgICAkJA0KDQoyLiAgKipTdXBwb3J0IGNvdW50IGZvcioqICRcezFzdCwgXHRleHR7QWR1bHQsIFllcywgRmVtYWxlfVx9JDogUnVuIHRoZQ0KICAgIGNvZGUgZm9yIHRoZSBjb3VudCBvZiBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWANCg0KMy4gICoqQ29uZmlkZW5jZSBmb3IqKg0KICAgICRcezFzdCwgXHRleHR7QWR1bHQsIFllc31cfSBccmlnaHRhcnJvdyBce1x0ZXh0e0ZlbWFsZX1cfSQ6DQogICAgQ2FsY3VsYXRlIGNvbmZpZGVuY2UgdXNpbmc6ICQkDQogICAgYyA9IFxmcmFje1xzaWdtYShcezFzdCwgXHRleHR7QWR1bHQsIFllcywgRmVtYWxlfVx9KX17XHNpZ21hKFx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9KX0NCiAgICAkJA0KDQojIyMgUS4xIEFuc3dlcjoNCg0KR2l2ZW4gdGhlIGRhdGFzZXQgc2l6ZSBvZiAqKjIyMDEgcmVjb3JkcyoqLCBJIGNhbGN1bGF0ZWQgdGhlIG1pbmltdW0NCnN1cHBvcnQgY291bnQgZm9yIGEgbWluc3VwIHRocmVzaG9sZCBvZiAwLjI1Og0KDQpgYGAgcHl0aG9uDQojIFRvdGFsIGRhdGFzZXQgc2l6ZQ0KdG90YWxfcmVjb3JkcyA9IDIyMDENCg0KIyBNaW5zdXAgdGhyZXNob2xkIGFuZCByZXF1aXJlZCBzdXBwb3J0IGNvdW50DQptaW5zdXBfdGhyZXNob2xkID0gMC4yNQ0KbWluc3VwX2NvdW50ID0gaW50KG1pbnN1cF90aHJlc2hvbGQgKiB0b3RhbF9yZWNvcmRzKSAgIyBSZXN1bHQgaXMgNTUwDQoNCnByaW50KCJSZXF1aXJlZCBzdXBwb3J0IGNvdW50IGZvciBtaW5zdXAgb2YgMC4yNToiLCBtaW5zdXBfY291bnQpDQpgYGANCg0KVGhpcyBtZWFucyBhbiBpdGVtc2V0IG5lZWRzIGEgc3VwcG9ydCBjb3VudCBvZiBhdCBsZWFzdCAqKjU1MCoqIHRvIGJlDQpmcmVxdWVudCBhdCB0aGlzIGxldmVsLiBDaGVja2luZyB0aGlzIGFnYWluc3QgdGhlIHN1cHBvcnQgY291bnRzIHdl4oCZdmUNCnNlZW46DQoNCi0gICBgezFzdCwgQWR1bHQsIFllc31gIGhhcyBhIHN1cHBvcnQgY291bnQgb2YgKioxOTcqKi4NCi0gICBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAqKjE0MCoqLg0KDQpTaW5jZSBib3RoIGFyZSBiZWxvdyA1NTAsIG5laXRoZXIgaXRlbXNldCBtZWV0cyB0aGUgbWluc3VwIHRocmVzaG9sZCBvZg0KMC4yNSwgc28gKipuZWl0aGVyIGlzIGZyZXF1ZW50KiouDQoNCkJhc2VkIG9uIHRoaXMsIEkgY29uY2x1ZGU6IC0gKipObyA0LWl0ZW1zZXRzIHdvdWxkIGJlIGZyZXF1ZW50IG9yDQptYXhpbWFsKiogYXQgdGhpcyBtaW5zdXAgbGV2ZWwsIHNpbmNlIGV2ZW4gdGhlIHJlbGV2YW50IDMtaXRlbXNldHMgZmFsbA0KYmVsb3cgdGhlIHJlcXVpcmVkIHN1cHBvcnQgY291bnQuDQoNCiMjIyBRLjIgQW5zd2VyOg0KDQotICAgVGhlICoqc3VwcG9ydCBjb3VudCBmb3IgYHsxc3QsIEFkdWx0LCBZZXN9YCoqIGlzIDE5Nywgd2l0aCBhIHN1cHBvcnQNCiAgICBvZiAqKjAuMDg5NSoqIG9yIGFib3V0ICoqOC45NSUqKiBvZiB0aGUgZGF0YXNldC4NCi0gICBUaGUgKipzdXBwb3J0IGNvdW50IGZvciBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAqKiBpcyAxNDAsIHdpdGggYQ0KICAgIHN1cHBvcnQgb2YgKiowLjA2MzYqKiBvciBhYm91dCAqKjYuMzYlKiouDQoNCiMjIyBRLjMgQW5zd2VyOg0KDQpUbyBjYWxjdWxhdGUgdGhlIGNvbmZpZGVuY2UgZm9yIHRoZSBydWxlIGB7MXN0LCBBZHVsdCwgWWVzfSDihpIge0ZlbWFsZX1gLA0KSSB1c2UgdGhlIHN1cHBvcnQgY291bnRzIGZyb20gcHJldmlvdXMgYW5zd2Vycy4NCg0KKipDb25maWRlbmNlIENhbGN1bGF0aW9uKio6ICQkDQpcdGV4dHtDb25maWRlbmNlfSA9IFxmcmFje1x0ZXh0e3N1cHBvcnQgY291bnQgb2YgfVx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzLCBGZW1hbGV9XH19e1x0ZXh0e3N1cHBvcnQgY291bnQgb2YgfVx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9fSA9IFxmcmFjezE0MH17MTk3fSBcYXBwcm94IDAuNzEwNw0KJCQNCg0KU28sIHRoZSAqKmNvbmZpZGVuY2UgZm9yIGB7MXN0LCBBZHVsdCwgWWVzfSDihpIge0ZlbWFsZX1gKiogaXMgYWJvdXQNCioqNzEuMDclKiouIFRoaXMgbWVhbnMgdGhhdCBpZiBzb21lb25lIGluIHRoZSBkYXRhc2V0IGlzIGZyb20gMXN0IGNsYXNzLA0KYW4gYWR1bHQsIGFuZCBzdXJ2aXZlZCwgdGhlcmXigJlzIGEgNzEuMDclIGNoYW5jZSB0aGV5IGFyZSBmZW1hbGUuDQoNCiMjIyBRLjQgQW5zd2VyOg0KDQoxLiAgKipTdXBwb3J0IENvdW50IGZvciBtaW5zdXAgVGhyZXNob2xkIG9mIDAuMjUqKjoNCg0KICAgIC0gICBXaXRoIGEgbWluc3VwIHRocmVzaG9sZCBvZiAwLjI1LCBhbiBpdGVtc2V0IG5lZWRzIGEgc3VwcG9ydA0KICAgICAgICBjb3VudCBvZiBhdCBsZWFzdCAqKjU1MCoqICgyNSUgb2YgMjIwMSByZWNvcmRzKSB0byBiZSBjb25zaWRlcmVkDQogICAgICAgIGZyZXF1ZW50Lg0KDQoyLiAgKipGcmVxdWVudCBJdGVtc2V0cyB3aXRoIG1pbnN1cCA9IDAuMjUqKjoNCg0KICAgIC0gICBUbyBiZSBmcmVxdWVudCwgYW4gaXRlbXNldCBtdXN0IGhhdmUgYSBzdXBwb3J0IGNvdW50IG9mIDU1MCBvcg0KICAgICAgICBtb3JlLiBMb29raW5nIGF0IG91ciBzdXBwb3J0IGNvdW50czoNCiAgICAgICAgLSAgIGB7MXN0LCBBZHVsdCwgWWVzfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAxOTcuDQogICAgICAgIC0gICBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAxNDAuDQogICAgLSAgIFNpbmNlIGJvdGggYXJlIGJlbG93IDU1MCwgKipuZWl0aGVyIG1lZXRzIHRoZSBtaW5zdXANCiAgICAgICAgdGhyZXNob2xkKiosIHNvIHRoZXnigJlyZSBub3QgZnJlcXVlbnQuDQoNCiAgICBCYXNlZCBvbiB0aGUgZGF0YXNldCwgb25seSB2ZXJ5IGJyb2FkIGNhdGVnb3JpZXMgKGxpa2UgYWxsIGBOb2AgZm9yDQogICAgYFN1cnZpdmVkYCBvciBhbGwgYE1hbGVgIGZvciBgU2V4YCkgYXJlIGxpa2VseSB0byBleGNlZWQgYSBzdXBwb3J0DQogICAgY291bnQgb2YgNTUwLg0KDQozLiAgKipNYXhpbWFsIDQtSXRlbXNldHMqKjoNCg0KICAgIC0gICBBbiBpdGVtc2V0IGlzICoqbWF4aW1hbCoqIGlmIGl04oCZcyBmcmVxdWVudCBhbmQgaGFzIG5vIGZyZXF1ZW50DQogICAgICAgIHN1cGVyc2V0cy4gU2luY2Ugbm9uZSBvZiB0aGUgNC1pdGVtc2V0cyByZWFjaCBhIHN1cHBvcnQgY291bnQgb2YNCiAgICAgICAgNTUwLCAqKm5vIDQtaXRlbXNldHMgYXJlIGZyZXF1ZW50IG9yIG1heGltYWwqKiBhdCB0aGlzIG1pbnN1cA0KICAgICAgICBsZXZlbC4NCg0KIyMjIFEuNSBBbnN3ZXI6DQoNCjEuICAqKlN0ZXAgMTogSWRlbnRpZnkgRnJlcXVlbnQgMy1JdGVtc2V0cyoqDQogICAgLSAgIFdpdGggYSBtaW5pbXVtIHN1cHBvcnQgY291bnQgb2YgMjAwLCB0aGUgZm9sbG93aW5nIDMtaXRlbXNldHMNCiAgICAgICAgZnJvbSB0aGUgYmFyIGdyYXBoIGFyZSBmcmVxdWVudDoNCiAgICAgICAgLSAgIGB7QWR1bHQsIEZlbWFsZSwgTm99YCB3aXRoIGEgc3VwcG9ydCBvZiAxMjAwDQogICAgICAgIC0gICBge0NyZXcsIE1hbGUsIE5vfWAgd2l0aCBhIHN1cHBvcnQgb2YgNjAwDQogICAgICAgIC0gICBgezNyZCwgTWFsZSwgTm99YCB3aXRoIGEgc3VwcG9ydCBvZiAzMDANCjIuICAqKlN0ZXAgMjogQXBwbHkgdGhlIEFwcmlvcmkgUHJpbmNpcGxlKioNCiAgICAtICAgVG8gZ2VuZXJhdGUgY2FuZGlkYXRlIDQtaXRlbXNldHMsIEkgdXNlIHRoZSBhcHJpb3JpIHByaW5jaXBsZSwNCiAgICAgICAgd2hpY2ggc3RhdGVzIHRoYXQgYW55IHN1YnNldCBvZiBhIGZyZXF1ZW50IGl0ZW1zZXQgbXVzdCBhbHNvIGJlDQogICAgICAgIGZyZXF1ZW50LiBTbywgSSBjYW4gb25seSBmb3JtIGEgNC1pdGVtc2V0IGlmIHR3byAzLWl0ZW1zZXRzDQogICAgICAgIHNoYXJlIGF0IGxlYXN0IHR3byBjb21tb24gYXR0cmlidXRlcy4NCjMuICAqKlN0ZXAgMzogQXR0ZW1wdCB0byBHZW5lcmF0ZSA0LUl0ZW1zZXRzKioNCiAgICAtICAgYHtBZHVsdCwgRmVtYWxlLCBOb31gIGFuZCBge0NyZXcsIE1hbGUsIE5vfWAgZG9u4oCZdCBzaGFyZSBlbm91Z2gNCiAgICAgICAgYXR0cmlidXRlcyB0byBmb3JtIGEgdmFsaWQgNC1pdGVtc2V0Lg0KICAgIC0gICBge0NyZXcsIE1hbGUsIE5vfWAgYW5kIGB7M3JkLCBNYWxlLCBOb31gIGRpZmZlciBpbiB0aGUgYENsYXNzYA0KICAgICAgICBhdHRyaWJ1dGUsIHNvIHRoZXkgZG9u4oCZdCBjb21iaW5lIGludG8gYSBmcmVxdWVudCA0LWl0ZW1zZXQuDQogICAgLSAgIGB7QWR1bHQsIEZlbWFsZSwgTm99YCBhbmQgYHszcmQsIE1hbGUsIE5vfWAgYWxzbyBsYWNrIHNoYXJlZA0KICAgICAgICBhdHRyaWJ1dGVzLCBwcmV2ZW50aW5nIGEgNC1pdGVtc2V0Lg0KDQoqKkNvbmNsdXNpb24qKg0KDQpTaW5jZSBub25lIG9mIHRoZXNlIGZyZXF1ZW50IDMtaXRlbXNldHMgb3ZlcmxhcCBlbm91Z2ggdG8gbWVldCB0aGUNCmFwcmlvcmkgcHJpbmNpcGxlLCAqKm5vIGNhbmRpZGF0ZSA0LWl0ZW1zZXRzIGNhbiBiZSBnZW5lcmF0ZWQqKiB0aGF0DQp3b3VsZCBtZWV0IHRoZSBtaW5zdXAgdGhyZXNob2xkLg0KDQpbQ29sYWJdKGh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9kcml2ZS8xUFBmSE9Ccy13WGh5RllSeVlsM1ZodHVZNHZGcEh6eVQjc2Nyb2xsVG89V3MyQzJobFJPWlRhKQ0KDQpbUlB1YnNdKGh0dHBzOi8vcnB1YnMuY29tL1RleGFzY2hpa2tpdGEvbWw3MzMxX0lDQTUpDQo=