Diffusion Index and graph in via a ggplot
The Diffusion Index created for the US Economy is by using three
economic variables of the United States Economy they are • Unemployment
Rate (UNRATE) • Average Hourly Earnings of All Employees (CES0500000003)
• Consumer Price Index for All Urban Consumers (CPIAUCSL)
The data is then trimmed down for the period 2010 to 2024 in monthly
frequency so that it can be interpreted clearly
The first differences were calculated for each series to measure the
changes over time. The differences were then converted into up (1), down
(-1), or no change (0). This transformation helps in identifying trends
and calculating the Diffusion Index.
The Diffusion Index was calculated using the formula: Diffusion
Index=(Positives/Total−Negatives/Total) The result was a time series of
monthly Diffusion Index values ranging from -1 to 1, which we scaled to
-100 to 100 for better interpretability.

The graph shows several cycles of economic performance.
For instance, there are periods where the index remains positive for
an extended time, indicating sustained economic growth.
Conversely, extended periods below zero suggest prolonged economic
downturns.
Large spikes or drops in the index could correspond to significant
economic events or policy changes.
2010-2012: The period following the 2008 financial crisis, likely
showing recovery.
2013-2015: Periods of stable economic growth.
2020: A significant drop, possibly related to the COVID-19
pandemic.
2021-2023: Economic recovery post-pandemic.
Diffusion Index and graph in via a ggplot with a built in smoother
or you create the smoother.

The Smoother signifies for the period
2010-2012: This period shows a recovery phase from the 2008 financial
crisis, with values increasing and staying positive.
2013-2015: Relative stability, with smaller fluctuations around the
zero line, indicating steady economic conditions.
2020: A sharp decline, likely corresponding to the economic impact of
the COVID-19 pandemic.
2021-2023: A recovery phase, with the index moving back to positive
values.
Here the Orange Smoother Line Helps to visualize the overall trend by
averaging out short-term volatility.
And the Gray Shaded Area Indicates the confidence interval, showing
the range within which the true trend likely falls. A narrower band
suggests higher confidence in the trend estimate.
Chicago Fed National Activity Index: Diffusion Index
(CFNAIDIFF)

Then I got the data for Chicago Fed National Activity Index:
Diffusion Index for the same period (2010 - 2024) as my US Economic
Diffusion Index and then I added a smoother to it. It can easily be
interpreted by stating that Between 2010 and 2015, the index generally
trends downwards, suggesting periods of weaker economic activity. From
2015 to 2020, the index shows more volatility but with a slight upward
trend, indicating moderate economic improvement. Around 2020, there’s a
notable peak, followed by a significant decline post-2020, reflecting
the impact of the COVID-19 pandemic.
Here are the both Diffusion Index plots with their smoothers

(i) calculating the correlation coefficient
unemp avghr cpi cfnaid
unemp 1.0000000 -0.59759267 -0.62428677 0.19477706
avghr -0.5975927 1.00000000 0.98786874 -0.04384157
cpi -0.6242868 0.98786874 1.00000000 -0.07225501
cfnaid 0.1947771 -0.04384157 -0.07225501 1.00000000
The correlations between my economic indicators and Chicago Fed
National Activity Index: Diffusion Index are generally weak. This
implies that while there are some minor relationships, other variables
likely play a more substantial role in influencing the Chicago Fed
National Activity Index: Diffusion Index.
Specifically:
The unemployment rate has a slightly positive(0.19477706) but weak
correlation with CFNAIDIFF.
Average hourly earnings(-0.04384157) and CPI(-0.07225501) have
negligible impacts on CFNAIDIFF.

Here is a heat map to visually represent the relationship between my
economic factors and the Chicago Fed National Activity Index: Diffusion
Index.
(ii) a ggplot of the two series side by side.

In this graph I am comparing two key economic indicators: the US
Economy Diffusion Index that I created and the Chicago Fed National
Activity Diffusion Index (CFNAIDIFF) from 2010 to 2024. Both indices
measure changes in economic conditions over time.
The US Economy Diffusion Index is represented by the blue line it
shows frequent and sharp fluctuations. This indicates a highly volatile
economic environment where conditions can change rapidly. In contrast,
the CFNAIDIFF, shown by the orange line it has smoother and less extreme
variations, suggesting a more stable pattern of economic activity.
From 2010 to 2015, the US Economy Diffusion Index reflects more
pronounced ups and downs, suggesting more rapid changes in the economy.
Meanwhile, the CFNAIDIFF maintains a more consistent, gradual trend.
Around 2020, there is a noticeable peak in the CFNAIDIFF followed by a
decline, likely reflecting the economic impact of the COVID-19 pandemic.
The blue line also shows significant activity around this period,
indicating substantial economic shifts. After the 2020 period the graph
shows ups and downs for both the indicators but the US Economic
Diffusion mostly stays in the positive region with only a single decline
to a negative region. But for the Chicago Fed National Activity
Diffusion Index (CFNAIDIFF) it frequenty dips to the negative region and
shows a declining trend which contradicts with my US Economic Diffusion
Index which shows some positive growth towards the end.
Conclusion:
Overall, this comparison highlights the differences in volatility and
stability between the two indices. While the US Economy Diffusion Index
points to more immediate and dramatic economic changes, the Chicago Fed
National Activity Diffusion Index (CFNAIDIFF) provides a steadier
perspective on economic trends. This analysis can help us understand the
nuances in how different economic indicators reflect the overall health
and activity of the economy.
LS0tDQp0aXRsZTogIkZhbGwyNA0KRmluYWxfRGlmZnVzaW9uIENvbmZ1c2lvbg0KRWNvbi02NjM1LTA3DQpNb2hhbW1lZCBGYWlzYWwgQWhtZWQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCg0KLS0tDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpzdXBwcmVzc1dhcm5pbmdzKHsNCiAgc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsNCmxpYnJhcnkobWFya292Y2hhaW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRzYm94KQ0KbGlicmFyeSh2YXJzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBkZmV0Y2gpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkodHNib3gpDQpsaWJyYXJ5KHRzaWJibGUpDQpsaWJyYXJ5KHRpbWV0aykNCmxpYnJhcnkoVFNzdHVkaW8pDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHlncmFwaHMpDQpsaWJyYXJ5KHF1YW50bW9kKSANCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoY29ycnBsb3QpfSkNCn0pDQoNCmdldFN5bWJvbHMoYygiVU5SQVRFIiwgIkNFUzA1MDAwMDAwMDMiLCAiQ1BJQVVDU0wiLCAiQ0ZOQUlESUZGIiksIA0KICAgICAgICAgICAgICAgICAgICAgZnJlcSA9ICJtb250aGx5IiwgDQogICAgICAgICAgICAgICAgICAgICBzcmMgPSAiRlJFRCIsIHJldHVybi5jbGFzcyA9ICd4dHMnLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXguY2xhc3MgID0gJ0RhdGUnLA0KICAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICIyMDEwLTAxLTAxIiwNCiAgICAgICAgICAgICAgICAgICAgIHRvID0gU3lzLkRhdGUoKSwNCiAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljaXR5ID0gIm1vbnRobHkiKQ0KDQpgYGANCg0KIyMgRGlmZnVzaW9uIEluZGV4IGFuZCBncmFwaCBpbiB2aWEgYSBnZ3Bsb3QgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIERpZmZ1c2lvbiBJbmRleCBhbmQgZ3JhcGggaW4gdmlhIGEgZ2dwbG90IA0KDQogICAgICAgICAgICAgIHRzX2luZm8oVU5SQVRFKQ0KICAgICAgICAgICAgICB0c19pbmZvKENFUzA1MDAwMDAwMDMpDQogICAgICAgICAgICAgIHRzX2luZm8oQ1BJQVVDU0wpDQp1bmVtcCA9IFVOUkFURQ0KYXZnaHIgPSBDRVMwNTAwMDAwMDAzDQpjcGkgPSBDUElBVUNTTA0KDQogICAgICAgICAgICAgIHRzX2luZm8odW5lbXApDQogICAgICAgICAgICAgIHRzX2luZm8oYXZnaHIpDQogICAgICAgICAgICAgIHRzX2luZm8oY3BpKSAgICAgICAgDQogICAgICAgIA0KICAgICAgICAgICAgICAjY292ZXJ0IHRvIHRzDQogICAgICAgIHVuZW1wIDwtIHVuZW1wWyIyMDEwLTAxLTAxLzIwMjQtMTAtMDEiXSB8PiB0c190cygpIA0KICAgICAgICBhdmdociA8LSBhdmdoclsiMjAxMC0wMS0wMS8yMDI0LTEwLTAxIl0gfD4gdHNfdHMoKSANCiAgICAgICAgY3BpIDwtIGNwaVsiMjAxMC0wMS0wMS8yMDI0LTEwLTAxIl0gfD4gdHNfdHMoKSANCiAgICAgICAgIw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjYXNzZW1ibGUgaXQNCiAgICAgICAgICAgIG15ZGF0YSA9IGNiaW5kLmRhdGEuZnJhbWUodW5lbXAsYXZnaHIsY3BpKQ0KICAgICAgICAgICAgaGVhZChteWRhdGEsMykNCiAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAjJyBPYnRhaW4gZmlyc3QgZGlmZmVyZW5jZXMNCiAgICAgICAgICAgICAgICAgIG15ZGYgPSBteWRhdGEgJT4lIA0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUodW5lbXBEMSA9IHRzaWJibGU6OmRpZmZlcmVuY2UodW5lbXAsIGRpZmZlcmVuY2VzID0gMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdockQxID0gdHNpYmJsZTo6ZGlmZmVyZW5jZShhdmdociwgZGlmZmVyZW5jZXMgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpRDEgPSB0c2liYmxlOjpkaWZmZXJlbmNlKGNwaSwgZGlmZmVyZW5jZXMgPSAxKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGModW5lbXBEMSwgYXZnaHJEMSwgY3BpRDEpKSB8PiBuYS5vbWl0KCkNCg0KICAgICAgICAgICAgICAgICAgY29sU3Vtcyhpcy5uYShteWRmKSkNCg0KICAgICAgICAgICAgICAgICMgQ29udmVydCB0byBlaXRoZXIgdXAgb3IgZG93bg0KICAgICAgICAgICAgICAgIGhlYWQobXlkZiwzKQ0KICAgICAgICAgICAgICAgIG15ZGZfZGYgPSBpZmVsc2UobXlkZiA+IDAsIDEsIC0xICkNCiAgICAgICAgICAgICAgICBteWRmX2RmDQogICAgICAgICAgICAgICAgICAgIHRhYmxlKG15ZGZfZGYpDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgI2NvbnZlcnQgdG8gdXAsZG93biwgb3Igbm8gY2hhbmdlDQogICAgICBteWRmX21hdCA9IGFwcGx5KG15ZGYsIDIsIHNpZ24pIA0KICAgICAgICAgIHRhYmxlKG15ZGZfbWF0KQ0KICAgICAgbXlkZl9tYXQNCiAgICAgIA0KDQogICAgICAgICAgICBwb3MgPSBhcHBseShteWRmX21hdCwgMSwgIGZ1bmN0aW9uKHJvdykgc3VtKHJvdz4wKSApICMgY291bnRzIHRoZSBwb3NpdGl2ZQ0KICAgICAgICAgICAgbmVnID0gYXBwbHkobXlkZl9tYXQsIDEsICBmdW5jdGlvbihyb3cpIHN1bShyb3c8MCkgKSAjIGNvdW50cyB0aGUgbmVnYXRpdmVzDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAjcG9zID0gYXBwbHkobXlkZiwgMSwgIGZ1bmN0aW9uKHJvdykgc3VtKHJvdz4wKSApICMgY291bnRzIHRoZSBwb3NpdGl2ZQ0KICAgICAgICAgICAgICAgICNuZWcgPSBhcHBseShteWRmLCAxLCAgZnVuY3Rpb24ocm93KSBzdW0ocm93PDApICkgIyBjb3VudHMgdGhlIG5lZ2F0aXZlcw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0b3QgPSBwb3MgKyBuZWcNCiAgICAgICAgICAgIChpbmRleCA9IChwb3MvdG90IC0gbmVnL3RvdCkpDQogICAgICAgICAgICAgICAgdGFibGUoaW5kZXgpDQogICAgICAgICAgICAgICAgc3RyKGluZGV4KQ0KICAgICAgICAgICAgICAgIA0KRGF0ZSA9IHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDEwLTA1LTEiKSwgbGVuZ3RoLm91dCA9IDE3NywgYnkgPSAibW9udGgiKQ0KICAgICAgICAgICAgbGVuZ3RoKERhdGUpDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpbmRleF9kZiA8LSBkYXRhLmZyYW1lKGluZGV4ID0gaW5kZXgsIHRpbWUgPSBEYXRlKSANCg0KICAgICAgICAgICAgICAgIGNiaW5kKG15ZGZfbWF0LCBwb3MsIG5lZywgdG90LCBpbmRleCkNCg0KbWFfaW5kZXggPSB6b286OnJvbGxtZWFuKGluZGV4LCA3LCBhbGlnbiA9ICJyaWdodCIpDQogICAgbGVuZ3RoKGluZGV4KQ0KYGBgDQpUaGUgRGlmZnVzaW9uIEluZGV4IGNyZWF0ZWQgZm9yIHRoZSBVUyBFY29ub215IGlzIGJ5IHVzaW5nIHRocmVlIGVjb25vbWljIA0KdmFyaWFibGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIEVjb25vbXkgdGhleSBhcmUNCuKAoglVbmVtcGxveW1lbnQgUmF0ZSAoVU5SQVRFKQ0K4oCiCUF2ZXJhZ2UgSG91cmx5IEVhcm5pbmdzIG9mIEFsbCBFbXBsb3llZXMgKENFUzA1MDAwMDAwMDMpDQrigKIJQ29uc3VtZXIgUHJpY2UgSW5kZXggZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMgKENQSUFVQ1NMKQ0KDQpUaGUgZGF0YSBpcyB0aGVuIHRyaW1tZWQgZG93biBmb3IgdGhlIHBlcmlvZCAyMDEwIHRvIDIwMjQgaW4gbW9udGhseSBmcmVxdWVuY3kgDQpzbyB0aGF0IGl0IGNhbiBiZSBpbnRlcnByZXRlZCBjbGVhcmx5DQoNClRoZSBmaXJzdCBkaWZmZXJlbmNlcyB3ZXJlIGNhbGN1bGF0ZWQgZm9yIGVhY2ggc2VyaWVzIHRvIG1lYXN1cmUgdGhlIGNoYW5nZXMgb3ZlciANCnRpbWUuIFRoZSBkaWZmZXJlbmNlcyB3ZXJlIHRoZW4gY29udmVydGVkIGludG8gdXAgKDEpLCBkb3duICgtMSksIG9yIA0Kbm8gY2hhbmdlICgwKS4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBoZWxwcyBpbiBpZGVudGlmeWluZyB0cmVuZHMgYW5kIGNhbGN1bGF0aW5nIA0KdGhlIERpZmZ1c2lvbiBJbmRleC4NCg0KVGhlIERpZmZ1c2lvbiBJbmRleCB3YXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9ybXVsYToNCkRpZmZ1c2lvbiBJbmRleD0oUG9zaXRpdmVzL1RvdGFs4oiSTmVnYXRpdmVzL1RvdGFsKQ0KVGhlIHJlc3VsdCB3YXMgYSB0aW1lIHNlcmllcyBvZiBtb250aGx5IERpZmZ1c2lvbiBJbmRleCB2YWx1ZXMgcmFuZ2luZyBmcm9tIA0KLTEgdG8gMSwgd2hpY2ggd2Ugc2NhbGVkIHRvIC0xMDAgdG8gMTAwIGZvciBiZXR0ZXIgaW50ZXJwcmV0YWJpbGl0eS4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpnZ3Bsb3QoaW5kZXhfZGYsIGFlcyh4ID0gdGltZSwgeT1pbmRleCkgKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIikgKyAgICANCiAgICAgICAgICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImRhcmtyZWQiKSArIA0KICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCIsIHggPSAiT2JzZXJ2YXRpb24iLCB5ID0gIkluZGV4IFZhbHVlIikgKyANCiAgICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClRoZSBncmFwaCBzaG93cyBzZXZlcmFsIGN5Y2xlcyBvZiBlY29ub21pYyBwZXJmb3JtYW5jZS4NCg0KRm9yIGluc3RhbmNlLCB0aGVyZSBhcmUgcGVyaW9kcyB3aGVyZSB0aGUgaW5kZXggcmVtYWlucyBwb3NpdGl2ZSBmb3IgYW4gZXh0ZW5kZWQgDQp0aW1lLCBpbmRpY2F0aW5nIHN1c3RhaW5lZCBlY29ub21pYyBncm93dGguDQoNCkNvbnZlcnNlbHksIGV4dGVuZGVkIHBlcmlvZHMgYmVsb3cgemVybyBzdWdnZXN0IHByb2xvbmdlZCBlY29ub21pYyBkb3dudHVybnMuDQoNCkxhcmdlIHNwaWtlcyBvciBkcm9wcyBpbiB0aGUgaW5kZXggY291bGQgY29ycmVzcG9uZCB0byBzaWduaWZpY2FudCBlY29ub21pYyANCmV2ZW50cyBvciBwb2xpY3kgY2hhbmdlcy4NCg0KMjAxMC0yMDEyOiBUaGUgcGVyaW9kIGZvbGxvd2luZyB0aGUgMjAwOCBmaW5hbmNpYWwgY3Jpc2lzLCBsaWtlbHkgc2hvd2luZyANCnJlY292ZXJ5Lg0KDQoyMDEzLTIwMTU6IFBlcmlvZHMgb2Ygc3RhYmxlIGVjb25vbWljIGdyb3d0aC4NCg0KMjAyMDogQSBzaWduaWZpY2FudCBkcm9wLCBwb3NzaWJseSByZWxhdGVkIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYy4NCg0KMjAyMS0yMDIzOiBFY29ub21pYyByZWNvdmVyeSBwb3N0LXBhbmRlbWljLg0KDQojIyBEaWZmdXNpb24gSW5kZXggYW5kIGdyYXBoIGluIHZpYSBhIGdncGxvdCB3aXRoIGEgYnVpbHQgaW4gc21vb3RoZXIgb3IgeW91IGNyZWF0ZSB0aGUgc21vb3RoZXIuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojRGlmZnVzaW9uIEluZGV4IGFuZCBncmFwaCBpbiB2aWEgYSBnZ3Bsb3Qgd2l0aCBhIGJ1aWx0IGluIHNtb290aGVyIG9yIHlvdSBjcmVhdGUgdGhlIHNtb290aGVyLg0KDQpnMSA9IGdncGxvdChpbmRleF9kZiwgYWVzKHggPSB0aW1lLCB5ID0gaW5kZXgpKSArDQogICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIikrDQogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZGFya3JlZCIpKw0KICAgICAgICAgIGdlb21fc21vb3RoKGNvbG91ciA9ICJkYXJrZ3JlZW4iKSArDQogICAgICAgICAgbGFicyggdGl0bGUgPSAiVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXggd2l0aCBTbW9vdGhlciIpICsNCiAgICAgICAgICB4bGFiKCJNb250aHMiKSArDQogICAgICAgICAgeWxhYigiQ2hhbmdlIikrDQogICAgICAgICAgdGhlbWUoYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZT0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgZWxlbWVudF9ibGFuaygpKSArDQogICAgICAgICAgdGhlbWVfdHVmdGUoKQ0KDQpnMQ0KYGBgDQoNClRoZSBTbW9vdGhlciBzaWduaWZpZXMgZm9yIHRoZSBwZXJpb2QgDQoNCjIwMTAtMjAxMjogVGhpcyBwZXJpb2Qgc2hvd3MgYSByZWNvdmVyeSBwaGFzZSBmcm9tIHRoZSAyMDA4IGZpbmFuY2lhbCBjcmlzaXMsIA0Kd2l0aCB2YWx1ZXMgaW5jcmVhc2luZyBhbmQgc3RheWluZyBwb3NpdGl2ZS4NCg0KMjAxMy0yMDE1OiBSZWxhdGl2ZSBzdGFiaWxpdHksIHdpdGggc21hbGxlciBmbHVjdHVhdGlvbnMgYXJvdW5kIHRoZSB6ZXJvIGxpbmUsIA0KaW5kaWNhdGluZyBzdGVhZHkgZWNvbm9taWMgY29uZGl0aW9ucy4NCg0KMjAyMDogQSBzaGFycCBkZWNsaW5lLCBsaWtlbHkgY29ycmVzcG9uZGluZyB0byB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIHRoZSANCkNPVklELTE5IHBhbmRlbWljLg0KDQoyMDIxLTIwMjM6IEEgcmVjb3ZlcnkgcGhhc2UsIHdpdGggdGhlIGluZGV4IG1vdmluZyBiYWNrIHRvIHBvc2l0aXZlIHZhbHVlcy4NCg0KSGVyZSB0aGUgT3JhbmdlIFNtb290aGVyIExpbmUgSGVscHMgdG8gdmlzdWFsaXplIHRoZSBvdmVyYWxsIHRyZW5kIGJ5IGF2ZXJhZ2luZyANCm91dCBzaG9ydC10ZXJtIHZvbGF0aWxpdHkuDQoNCkFuZCB0aGUgR3JheSBTaGFkZWQgQXJlYSBJbmRpY2F0ZXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHNob3dpbmcgdGhlIHJhbmdlIA0Kd2l0aGluIHdoaWNoIHRoZSB0cnVlIHRyZW5kIGxpa2VseSBmYWxscy4gQSBuYXJyb3dlciBiYW5kIHN1Z2dlc3RzIGhpZ2hlciANCmNvbmZpZGVuY2UgaW4gdGhlIHRyZW5kIGVzdGltYXRlLg0KDQojIyBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjZm5haWQgPSBDRk5BSURJRkYNCg0KdHNfaW5mbyhDRk5BSURJRkYpDQoNCiNjb252ZXJ0IHRvIHRzDQpjZm5haWQgPC0gY2ZuYWlkWyIyMDEwLTAxLTAxLzIwMjQtMTAtMDEiXSB8PiB0c190cygpDQoNCmxlbmd0aChjZm5haWQpDQoNCiMgQ29udmVydCBjZm5haWQgdG8gYSBkYXRhIGZyYW1lIA0KY2ZuYWlkX2RmIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IERhdGUsIGNmbmFpZCA9IGFzLm51bWVyaWMoY2ZuYWlkWy1jKDEpXSkpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZzIgPSBnZ3Bsb3QoY2ZuYWlkX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBjZm5haWQpKSArDQogICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gIm9yYW5nZXJlZCIpKw0KICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImRhcmtyZWQiKSArDQogICAgICAgICAgZ2VvbV9zbW9vdGgoY29sb3VyID0gImRhcmtibHVlIikgKw0KICAgICAgICAgIGxhYnMoIHRpdGxlID0gIkNoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggd2l0aCBzbW9vdGhlciIpICsNCiAgICAgICAgICB4bGFiKCJNb250aHMiKSArDQogICAgICAgICAgeWxhYigiQ2hhbmdlIikrDQogICAgICAgICAgdGhlbWUoYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZT0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgZWxlbWVudF9ibGFuaygpKSArDQogICAgICAgICAgdGhlbWVfdHVmdGUoKQ0KDQpnMg0KYGBgDQoNClRoZW4gSSBnb3QgdGhlIGRhdGEgZm9yIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggZm9yDQp0aGUgc2FtZSBwZXJpb2QgKDIwMTAgLSAyMDI0KSBhcyBteSBVUyBFY29ub21pYyBEaWZmdXNpb24gSW5kZXggYW5kIHRoZW4gSSBhZGRlZA0KYSBzbW9vdGhlciB0byBpdC4gSXQgY2FuIGVhc2lseSBiZSBpbnRlcnByZXRlZCBieSBzdGF0aW5nIHRoYXQgQmV0d2VlbiAyMDEwIGFuZCANCjIwMTUsIHRoZSBpbmRleCBnZW5lcmFsbHkgdHJlbmRzIGRvd253YXJkcywgc3VnZ2VzdGluZyBwZXJpb2RzIG9mIHdlYWtlciANCmVjb25vbWljIGFjdGl2aXR5LiBGcm9tIDIwMTUgdG8gMjAyMCwgdGhlIGluZGV4IHNob3dzIG1vcmUgdm9sYXRpbGl0eSBidXQgd2l0aCBhIA0Kc2xpZ2h0IHVwd2FyZCB0cmVuZCwgaW5kaWNhdGluZyBtb2RlcmF0ZSBlY29ub21pYyBpbXByb3ZlbWVudC4gQXJvdW5kIDIwMjAsIA0KdGhlcmUncyBhIG5vdGFibGUgcGVhaywgZm9sbG93ZWQgYnkgYSBzaWduaWZpY2FudCBkZWNsaW5lIHBvc3QtMjAyMCwgcmVmbGVjdGluZyANCnRoZSBpbXBhY3Qgb2YgdGhlIENPVklELTE5IHBhbmRlbWljLg0KDQojDQoNCiMNCg0KIyMgSGVyZSBhcmUgdGhlIGJvdGggRGlmZnVzaW9uIEluZGV4IHBsb3RzIHdpdGggdGhlaXIgc21vb3RoZXJzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmlkLmFycmFuZ2UoZzEsIGcyLCBucm93ID0gMikNCmBgYA0KDQoNCg0KIyMgKGkpIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY29ycmVsYXRpb25fZGYgPSBjYmluZC5kYXRhLmZyYW1lKG15ZGF0YSxjZm5haWQpDQoNCmNvcnJlbGF0aW9uX2NvZWZmaWNpZW50ID0gY29yKGNvcnJlbGF0aW9uX2RmKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvcnJlbGF0aW9uX2NvZWZmaWNpZW50DQpgYGANCg0KVGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIG15IGVjb25vbWljIGluZGljYXRvcnMgYW5kIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IA0KSW5kZXg6IERpZmZ1c2lvbiBJbmRleCBhcmUgZ2VuZXJhbGx5IHdlYWsuIFRoaXMgaW1wbGllcyB0aGF0IHdoaWxlIHRoZXJlIGFyZSANCnNvbWUgbWlub3IgcmVsYXRpb25zaGlwcywgb3RoZXIgdmFyaWFibGVzIGxpa2VseSBwbGF5IGEgbW9yZSBzdWJzdGFudGlhbCByb2xlIGluIA0KaW5mbHVlbmNpbmcgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXguIA0KDQpTcGVjaWZpY2FsbHk6DQoNClRoZSB1bmVtcGxveW1lbnQgcmF0ZSBoYXMgYSBzbGlnaHRseSBwb3NpdGl2ZSgwLjE5NDc3NzA2KSBidXQgd2VhayBjb3JyZWxhdGlvbiANCndpdGggQ0ZOQUlESUZGLg0KDQpBdmVyYWdlIGhvdXJseSBlYXJuaW5ncygtMC4wNDM4NDE1NykgYW5kIENQSSgtMC4wNzIyNTUwMSkgaGF2ZSBuZWdsaWdpYmxlIA0KaW1wYWN0cyBvbiBDRk5BSURJRkYuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb3JycGxvdChjb3JyZWxhdGlvbl9jb2VmZmljaWVudCwgbWV0aG9kID0gImNvbG9yIikNCmBgYA0KDQpIZXJlIGlzIGEgaGVhdCBtYXAgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBteSBlY29ub21pYyANCmZhY3RvcnMgYW5kIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4Lg0KDQojDQoNCiMNCg0KIyMgKGlpKSBhIGdncGxvdCBvZiB0aGUgdHdvIHNlcmllcyBzaWRlIGJ5IHNpZGUuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjb21iaW5lZF9kYXRhIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IERhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleGAgPSBpbmRleCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleGAgPSBjZm5haWRbLTFdKSANCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChjb21iaW5lZF9kYXRhKSArIA0KICBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gVVMuRWNvbm9teS5EaWZmdXNpb24uSW5kZXgsIA0KICAgICAgICAgICAgICAgIGNvbG9yID0gIlVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IikpICsgDQogIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDaGljYWdvLkZlZC5OYXRpb25hbC5BY3Rpdml0eS5EaWZmdXNpb24uSW5kZXgsIA0KICAgICAgICAgICAgICAgIGNvbG9yID0gIkNoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleCIpKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJkYXJrcmVkIikgKyANCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpc29uIG9mIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IGFuZCBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiLCANCiAgICAgICB4ID0gIk1vbnRocyIsIHkgPSAiQ2hhbmdlIiwgY29sb3IgPSAgIkluZGV4IFR5cGUiKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXgiID0gImRhcmtibHVlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiID0gIm9yYW5nZXJlZCIpKSArIA0KICB0aGVtZShheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShzaXplID0gMC43NSwgY29sb3VyID0gImJsYWNrIikpICsNCiAgdGhlbWVfdHVmdGUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCg0KDQogICAgICAgIA0KYGBgDQoNCkluIHRoaXMgZ3JhcGggSSBhbSBjb21wYXJpbmcgdHdvIGtleSBlY29ub21pYyBpbmRpY2F0b3JzOiB0aGUgVVMgRWNvbm9teSANCkRpZmZ1c2lvbiBJbmRleCB0aGF0IEkgY3JlYXRlZCBhbmQgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiANCkluZGV4IChDRk5BSURJRkYpIGZyb20gMjAxMCB0byAyMDI0LiBCb3RoIGluZGljZXMgbWVhc3VyZSBjaGFuZ2VzIGluIGVjb25vbWljIA0KY29uZGl0aW9ucyBvdmVyIHRpbWUuDQoNClRoZSBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCBpcyByZXByZXNlbnRlZCBieSB0aGUgYmx1ZSBsaW5lIGl0IHNob3dzIGZyZXF1ZW50IA0KYW5kIHNoYXJwIGZsdWN0dWF0aW9ucy4gVGhpcyBpbmRpY2F0ZXMgYSBoaWdobHkgdm9sYXRpbGUgZWNvbm9taWMgZW52aXJvbm1lbnQgDQp3aGVyZSBjb25kaXRpb25zIGNhbiBjaGFuZ2UgcmFwaWRseS4gSW4gY29udHJhc3QsIHRoZSBDRk5BSURJRkYsIHNob3duIGJ5IHRoZSANCm9yYW5nZSBsaW5lIGl0IGhhcyBzbW9vdGhlciBhbmQgbGVzcyBleHRyZW1lIHZhcmlhdGlvbnMsIHN1Z2dlc3RpbmcgYSBtb3JlIA0Kc3RhYmxlIHBhdHRlcm4gb2YgZWNvbm9taWMgYWN0aXZpdHkuDQoNCkZyb20gMjAxMCB0byAyMDE1LCB0aGUgVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXggcmVmbGVjdHMgbW9yZSBwcm9ub3VuY2VkIHVwcyANCmFuZCBkb3ducywgc3VnZ2VzdGluZyBtb3JlIHJhcGlkIGNoYW5nZXMgaW4gdGhlIGVjb25vbXkuIE1lYW53aGlsZSwgdGhlIA0KQ0ZOQUlESUZGIG1haW50YWlucyBhIG1vcmUgY29uc2lzdGVudCwgZ3JhZHVhbCB0cmVuZC4gQXJvdW5kIDIwMjAsIHRoZXJlIGlzIGEgDQpub3RpY2VhYmxlIHBlYWsgaW4gdGhlIENGTkFJRElGRiBmb2xsb3dlZCBieSBhIGRlY2xpbmUsIGxpa2VseSByZWZsZWN0aW5nIHRoZSANCmVjb25vbWljIGltcGFjdCBvZiB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIFRoZSBibHVlIGxpbmUgYWxzbyBzaG93cyBzaWduaWZpY2FudCANCmFjdGl2aXR5IGFyb3VuZCB0aGlzIHBlcmlvZCwgaW5kaWNhdGluZyBzdWJzdGFudGlhbCBlY29ub21pYyBzaGlmdHMuIEFmdGVyIA0KdGhlIDIwMjAgcGVyaW9kIHRoZSBncmFwaCBzaG93cyB1cHMgYW5kIGRvd25zIGZvciBib3RoIHRoZSBpbmRpY2F0b3JzIGJ1dCB0aGUgVVMNCkVjb25vbWljIERpZmZ1c2lvbiBtb3N0bHkgc3RheXMgaW4gdGhlIHBvc2l0aXZlIHJlZ2lvbiB3aXRoIG9ubHkgYSBzaW5nbGUgDQpkZWNsaW5lIHRvIGEgbmVnYXRpdmUgcmVnaW9uLiBCdXQgZm9yIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gDQpJbmRleCAoQ0ZOQUlESUZGKSBpdCBmcmVxdWVudHkgZGlwcyB0byB0aGUgbmVnYXRpdmUgcmVnaW9uIGFuZCBzaG93cyBhIGRlY2xpbmluZyANCnRyZW5kIHdoaWNoIGNvbnRyYWRpY3RzIHdpdGggbXkgVVMgRWNvbm9taWMgRGlmZnVzaW9uIEluZGV4IHdoaWNoIHNob3dzIHNvbWUgDQpwb3NpdGl2ZSBncm93dGggdG93YXJkcyB0aGUgZW5kLg0KDQoNCiMjIENvbmNsdXNpb246DQpPdmVyYWxsLCB0aGlzIGNvbXBhcmlzb24gaGlnaGxpZ2h0cyB0aGUgZGlmZmVyZW5jZXMgaW4gdm9sYXRpbGl0eSBhbmQgc3RhYmlsaXR5IA0KYmV0d2VlbiB0aGUgdHdvIGluZGljZXMuIFdoaWxlIHRoZSBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCBwb2ludHMgdG8gbW9yZSANCmltbWVkaWF0ZSBhbmQgZHJhbWF0aWMgZWNvbm9taWMgY2hhbmdlcywgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IA0KRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpIHByb3ZpZGVzIGEgc3RlYWRpZXIgcGVyc3BlY3RpdmUgb24gZWNvbm9taWMgdHJlbmRzLiANClRoaXMgYW5hbHlzaXMgY2FuIGhlbHAgdXMgdW5kZXJzdGFuZCB0aGUgbnVhbmNlcyBpbiBob3cgZGlmZmVyZW50IGVjb25vbWljIGluZGljYXRvcnMgDQpyZWZsZWN0IHRoZSBvdmVyYWxsIGhlYWx0aCBhbmQgYWN0aXZpdHkgb2YgdGhlIGVjb25vbXkuDQoNCiMjIFJlZnJlbmNlczoNCg0KaHR0cHM6Ly9mcmVkLnN0bG91aXNmZWQub3JnLyAoZGF0YSBzb3VyY2UpDQrigKIJVW5lbXBsb3ltZW50IFJhdGUgKFVOUkFURSkNCuKAoglBdmVyYWdlIEhvdXJseSBFYXJuaW5ncyBvZiBBbGwgRW1wbG95ZWVzIChDRVMwNTAwMDAwMDAzKQ0K4oCiCUNvbnN1bWVyIFByaWNlIEluZGV4IGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzIChDUElBVUNTTCkNCuKAoglDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpDQoNCmh0dHBzOi8vd3d3LmJyaWRnZWxlZ2FsZWNvbm9taWNzLmNvbS9yZXNvdXJjZXMvYmxvZyAoSW5zcGlyYXRpb24pDQoNCmh0dHBzOi8vYXJvZHMtZG9jcy5zaXRlNDQuY29tL0NUU2NvcmVjYXJkLmh0bWwgKFRlbXBsYXRlIGZvciB0aGUgY29tcGFyaXRpb24gcGxvdCkNCg0KDQoNCg0KDQoNCg0KDQoNCg==