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.

Refrences:

https://fred.stlouisfed.org/ (data source) • Unemployment Rate (UNRATE) • Average Hourly Earnings of All Employees (CES0500000003) • Consumer Price Index for All Urban Consumers (CPIAUCSL) • Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF)

https://www.bridgelegaleconomics.com/resources/blog (Inspiration)

https://arods-docs.site44.com/CTScorecard.html (Template for the comparition plot)

LS0tDQp0aXRsZTogIkZhbGwyNA0KRmluYWxfRGlmZnVzaW9uIENvbmZ1c2lvbg0KRWNvbi02NjM1LTA3DQpNb2hhbW1lZCBGYWlzYWwgQWhtZWQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCg0KLS0tDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpzdXBwcmVzc1dhcm5pbmdzKHsNCiAgc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsNCmxpYnJhcnkobWFya292Y2hhaW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRzYm94KQ0KbGlicmFyeSh2YXJzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBkZmV0Y2gpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkodHNib3gpDQpsaWJyYXJ5KHRzaWJibGUpDQpsaWJyYXJ5KHRpbWV0aykNCmxpYnJhcnkoVFNzdHVkaW8pDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHlncmFwaHMpDQpsaWJyYXJ5KHF1YW50bW9kKSANCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoY29ycnBsb3QpfSkNCn0pDQoNCmdldFN5bWJvbHMoYygiVU5SQVRFIiwgIkNFUzA1MDAwMDAwMDMiLCAiQ1BJQVVDU0wiLCAiQ0ZOQUlESUZGIiksIA0KICAgICAgICAgICAgICAgICAgICAgZnJlcSA9ICJtb250aGx5IiwgDQogICAgICAgICAgICAgICAgICAgICBzcmMgPSAiRlJFRCIsIHJldHVybi5jbGFzcyA9ICd4dHMnLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXguY2xhc3MgID0gJ0RhdGUnLA0KICAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICIyMDEwLTAxLTAxIiwNCiAgICAgICAgICAgICAgICAgICAgIHRvID0gU3lzLkRhdGUoKSwNCiAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljaXR5ID0gIm1vbnRobHkiKQ0KDQpgYGANCg0KIyMgRGlmZnVzaW9uIEluZGV4IGFuZCBncmFwaCBpbiB2aWEgYSBnZ3Bsb3QgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIERpZmZ1c2lvbiBJbmRleCBhbmQgZ3JhcGggaW4gdmlhIGEgZ2dwbG90IA0KDQogICAgICAgICAgICAgIHRzX2luZm8oVU5SQVRFKQ0KICAgICAgICAgICAgICB0c19pbmZvKENFUzA1MDAwMDAwMDMpDQogICAgICAgICAgICAgIHRzX2luZm8oQ1BJQVVDU0wpDQp1bmVtcCA9IFVOUkFURQ0KYXZnaHIgPSBDRVMwNTAwMDAwMDAzDQpjcGkgPSBDUElBVUNTTA0KDQogICAgICAgICAgICAgIHRzX2luZm8odW5lbXApDQogICAgICAgICAgICAgIHRzX2luZm8oYXZnaHIpDQogICAgICAgICAgICAgIHRzX2luZm8oY3BpKSAgICAgICAgDQogICAgICAgIA0KICAgICAgICAgICAgICAjY292ZXJ0IHRvIHRzDQogICAgICAgIHVuZW1wIDwtIHVuZW1wWyIyMDEwLTAxLTAxLzIwMjQtMTAtMDEiXSB8PiB0c190cygpIA0KICAgICAgICBhdmdociA8LSBhdmdoclsiMjAxMC0wMS0wMS8yMDI0LTEwLTAxIl0gfD4gdHNfdHMoKSANCiAgICAgICAgY3BpIDwtIGNwaVsiMjAxMC0wMS0wMS8yMDI0LTEwLTAxIl0gfD4gdHNfdHMoKSANCiAgICAgICAgIw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjYXNzZW1ibGUgaXQNCiAgICAgICAgICAgIG15ZGF0YSA9IGNiaW5kLmRhdGEuZnJhbWUodW5lbXAsYXZnaHIsY3BpKQ0KICAgICAgICAgICAgaGVhZChteWRhdGEsMykNCiAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAjJyBPYnRhaW4gZmlyc3QgZGlmZmVyZW5jZXMNCiAgICAgICAgICAgICAgICAgIG15ZGYgPSBteWRhdGEgJT4lIA0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUodW5lbXBEMSA9IHRzaWJibGU6OmRpZmZlcmVuY2UodW5lbXAsIGRpZmZlcmVuY2VzID0gMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdockQxID0gdHNpYmJsZTo6ZGlmZmVyZW5jZShhdmdociwgZGlmZmVyZW5jZXMgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpRDEgPSB0c2liYmxlOjpkaWZmZXJlbmNlKGNwaSwgZGlmZmVyZW5jZXMgPSAxKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGModW5lbXBEMSwgYXZnaHJEMSwgY3BpRDEpKSB8PiBuYS5vbWl0KCkNCg0KICAgICAgICAgICAgICAgICAgY29sU3Vtcyhpcy5uYShteWRmKSkNCg0KICAgICAgICAgICAgICAgICMgQ29udmVydCB0byBlaXRoZXIgdXAgb3IgZG93bg0KICAgICAgICAgICAgICAgIGhlYWQobXlkZiwzKQ0KICAgICAgICAgICAgICAgIG15ZGZfZGYgPSBpZmVsc2UobXlkZiA+IDAsIDEsIC0xICkNCiAgICAgICAgICAgICAgICBteWRmX2RmDQogICAgICAgICAgICAgICAgICAgIHRhYmxlKG15ZGZfZGYpDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgI2NvbnZlcnQgdG8gdXAsZG93biwgb3Igbm8gY2hhbmdlDQogICAgICBteWRmX21hdCA9IGFwcGx5KG15ZGYsIDIsIHNpZ24pIA0KICAgICAgICAgIHRhYmxlKG15ZGZfbWF0KQ0KICAgICAgbXlkZl9tYXQNCiAgICAgIA0KDQogICAgICAgICAgICBwb3MgPSBhcHBseShteWRmX21hdCwgMSwgIGZ1bmN0aW9uKHJvdykgc3VtKHJvdz4wKSApICMgY291bnRzIHRoZSBwb3NpdGl2ZQ0KICAgICAgICAgICAgbmVnID0gYXBwbHkobXlkZl9tYXQsIDEsICBmdW5jdGlvbihyb3cpIHN1bShyb3c8MCkgKSAjIGNvdW50cyB0aGUgbmVnYXRpdmVzDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAjcG9zID0gYXBwbHkobXlkZiwgMSwgIGZ1bmN0aW9uKHJvdykgc3VtKHJvdz4wKSApICMgY291bnRzIHRoZSBwb3NpdGl2ZQ0KICAgICAgICAgICAgICAgICNuZWcgPSBhcHBseShteWRmLCAxLCAgZnVuY3Rpb24ocm93KSBzdW0ocm93PDApICkgIyBjb3VudHMgdGhlIG5lZ2F0aXZlcw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0b3QgPSBwb3MgKyBuZWcNCiAgICAgICAgICAgIChpbmRleCA9IChwb3MvdG90IC0gbmVnL3RvdCkpDQogICAgICAgICAgICAgICAgdGFibGUoaW5kZXgpDQogICAgICAgICAgICAgICAgc3RyKGluZGV4KQ0KICAgICAgICAgICAgICAgIA0KRGF0ZSA9IHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDEwLTA1LTEiKSwgbGVuZ3RoLm91dCA9IDE3NywgYnkgPSAibW9udGgiKQ0KICAgICAgICAgICAgbGVuZ3RoKERhdGUpDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpbmRleF9kZiA8LSBkYXRhLmZyYW1lKGluZGV4ID0gaW5kZXgsIHRpbWUgPSBEYXRlKSANCg0KICAgICAgICAgICAgICAgIGNiaW5kKG15ZGZfbWF0LCBwb3MsIG5lZywgdG90LCBpbmRleCkNCg0KbWFfaW5kZXggPSB6b286OnJvbGxtZWFuKGluZGV4LCA3LCBhbGlnbiA9ICJyaWdodCIpDQogICAgbGVuZ3RoKGluZGV4KQ0KYGBgDQpUaGUgRGlmZnVzaW9uIEluZGV4IGNyZWF0ZWQgZm9yIHRoZSBVUyBFY29ub215IGlzIGJ5IHVzaW5nIHRocmVlIGVjb25vbWljIA0KdmFyaWFibGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIEVjb25vbXkgdGhleSBhcmUNCuKAoglVbmVtcGxveW1lbnQgUmF0ZSAoVU5SQVRFKQ0K4oCiCUF2ZXJhZ2UgSG91cmx5IEVhcm5pbmdzIG9mIEFsbCBFbXBsb3llZXMgKENFUzA1MDAwMDAwMDMpDQrigKIJQ29uc3VtZXIgUHJpY2UgSW5kZXggZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMgKENQSUFVQ1NMKQ0KDQpUaGUgZGF0YSBpcyB0aGVuIHRyaW1tZWQgZG93biBmb3IgdGhlIHBlcmlvZCAyMDEwIHRvIDIwMjQgaW4gbW9udGhseSBmcmVxdWVuY3kgDQpzbyB0aGF0IGl0IGNhbiBiZSBpbnRlcnByZXRlZCBjbGVhcmx5DQoNClRoZSBmaXJzdCBkaWZmZXJlbmNlcyB3ZXJlIGNhbGN1bGF0ZWQgZm9yIGVhY2ggc2VyaWVzIHRvIG1lYXN1cmUgdGhlIGNoYW5nZXMgb3ZlciANCnRpbWUuIFRoZSBkaWZmZXJlbmNlcyB3ZXJlIHRoZW4gY29udmVydGVkIGludG8gdXAgKDEpLCBkb3duICgtMSksIG9yIA0Kbm8gY2hhbmdlICgwKS4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBoZWxwcyBpbiBpZGVudGlmeWluZyB0cmVuZHMgYW5kIGNhbGN1bGF0aW5nIA0KdGhlIERpZmZ1c2lvbiBJbmRleC4NCg0KVGhlIERpZmZ1c2lvbiBJbmRleCB3YXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9ybXVsYToNCkRpZmZ1c2lvbiBJbmRleD0oUG9zaXRpdmVzL1RvdGFs4oiSTmVnYXRpdmVzL1RvdGFsKQ0KVGhlIHJlc3VsdCB3YXMgYSB0aW1lIHNlcmllcyBvZiBtb250aGx5IERpZmZ1c2lvbiBJbmRleCB2YWx1ZXMgcmFuZ2luZyBmcm9tIA0KLTEgdG8gMSwgd2hpY2ggd2Ugc2NhbGVkIHRvIC0xMDAgdG8gMTAwIGZvciBiZXR0ZXIgaW50ZXJwcmV0YWJpbGl0eS4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpnZ3Bsb3QoaW5kZXhfZGYsIGFlcyh4ID0gdGltZSwgeT1pbmRleCkgKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIikgKyAgICANCiAgICAgICAgICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImRhcmtyZWQiKSArIA0KICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCIsIHggPSAiT2JzZXJ2YXRpb24iLCB5ID0gIkluZGV4IFZhbHVlIikgKyANCiAgICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClRoZSBncmFwaCBzaG93cyBzZXZlcmFsIGN5Y2xlcyBvZiBlY29ub21pYyBwZXJmb3JtYW5jZS4NCg0KRm9yIGluc3RhbmNlLCB0aGVyZSBhcmUgcGVyaW9kcyB3aGVyZSB0aGUgaW5kZXggcmVtYWlucyBwb3NpdGl2ZSBmb3IgYW4gZXh0ZW5kZWQgDQp0aW1lLCBpbmRpY2F0aW5nIHN1c3RhaW5lZCBlY29ub21pYyBncm93dGguDQoNCkNvbnZlcnNlbHksIGV4dGVuZGVkIHBlcmlvZHMgYmVsb3cgemVybyBzdWdnZXN0IHByb2xvbmdlZCBlY29ub21pYyBkb3dudHVybnMuDQoNCkxhcmdlIHNwaWtlcyBvciBkcm9wcyBpbiB0aGUgaW5kZXggY291bGQgY29ycmVzcG9uZCB0byBzaWduaWZpY2FudCBlY29ub21pYyANCmV2ZW50cyBvciBwb2xpY3kgY2hhbmdlcy4NCg0KMjAxMC0yMDEyOiBUaGUgcGVyaW9kIGZvbGxvd2luZyB0aGUgMjAwOCBmaW5hbmNpYWwgY3Jpc2lzLCBsaWtlbHkgc2hvd2luZyANCnJlY292ZXJ5Lg0KDQoyMDEzLTIwMTU6IFBlcmlvZHMgb2Ygc3RhYmxlIGVjb25vbWljIGdyb3d0aC4NCg0KMjAyMDogQSBzaWduaWZpY2FudCBkcm9wLCBwb3NzaWJseSByZWxhdGVkIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYy4NCg0KMjAyMS0yMDIzOiBFY29ub21pYyByZWNvdmVyeSBwb3N0LXBhbmRlbWljLg0KDQojIyBEaWZmdXNpb24gSW5kZXggYW5kIGdyYXBoIGluIHZpYSBhIGdncGxvdCB3aXRoIGEgYnVpbHQgaW4gc21vb3RoZXIgb3IgeW91IGNyZWF0ZSB0aGUgc21vb3RoZXIuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojRGlmZnVzaW9uIEluZGV4IGFuZCBncmFwaCBpbiB2aWEgYSBnZ3Bsb3Qgd2l0aCBhIGJ1aWx0IGluIHNtb290aGVyIG9yIHlvdSBjcmVhdGUgdGhlIHNtb290aGVyLg0KDQpnMSA9IGdncGxvdChpbmRleF9kZiwgYWVzKHggPSB0aW1lLCB5ID0gaW5kZXgpKSArDQogICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIikrDQogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZGFya3JlZCIpKw0KICAgICAgICAgIGdlb21fc21vb3RoKGNvbG91ciA9ICJkYXJrZ3JlZW4iKSArDQogICAgICAgICAgbGFicyggdGl0bGUgPSAiVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXggd2l0aCBTbW9vdGhlciIpICsNCiAgICAgICAgICB4bGFiKCJNb250aHMiKSArDQogICAgICAgICAgeWxhYigiQ2hhbmdlIikrDQogICAgICAgICAgdGhlbWUoYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZT0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgZWxlbWVudF9ibGFuaygpKSArDQogICAgICAgICAgdGhlbWVfdHVmdGUoKQ0KDQpnMQ0KYGBgDQoNClRoZSBTbW9vdGhlciBzaWduaWZpZXMgZm9yIHRoZSBwZXJpb2QgDQoNCjIwMTAtMjAxMjogVGhpcyBwZXJpb2Qgc2hvd3MgYSByZWNvdmVyeSBwaGFzZSBmcm9tIHRoZSAyMDA4IGZpbmFuY2lhbCBjcmlzaXMsIA0Kd2l0aCB2YWx1ZXMgaW5jcmVhc2luZyBhbmQgc3RheWluZyBwb3NpdGl2ZS4NCg0KMjAxMy0yMDE1OiBSZWxhdGl2ZSBzdGFiaWxpdHksIHdpdGggc21hbGxlciBmbHVjdHVhdGlvbnMgYXJvdW5kIHRoZSB6ZXJvIGxpbmUsIA0KaW5kaWNhdGluZyBzdGVhZHkgZWNvbm9taWMgY29uZGl0aW9ucy4NCg0KMjAyMDogQSBzaGFycCBkZWNsaW5lLCBsaWtlbHkgY29ycmVzcG9uZGluZyB0byB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIHRoZSANCkNPVklELTE5IHBhbmRlbWljLg0KDQoyMDIxLTIwMjM6IEEgcmVjb3ZlcnkgcGhhc2UsIHdpdGggdGhlIGluZGV4IG1vdmluZyBiYWNrIHRvIHBvc2l0aXZlIHZhbHVlcy4NCg0KSGVyZSB0aGUgT3JhbmdlIFNtb290aGVyIExpbmUgSGVscHMgdG8gdmlzdWFsaXplIHRoZSBvdmVyYWxsIHRyZW5kIGJ5IGF2ZXJhZ2luZyANCm91dCBzaG9ydC10ZXJtIHZvbGF0aWxpdHkuDQoNCkFuZCB0aGUgR3JheSBTaGFkZWQgQXJlYSBJbmRpY2F0ZXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHNob3dpbmcgdGhlIHJhbmdlIA0Kd2l0aGluIHdoaWNoIHRoZSB0cnVlIHRyZW5kIGxpa2VseSBmYWxscy4gQSBuYXJyb3dlciBiYW5kIHN1Z2dlc3RzIGhpZ2hlciANCmNvbmZpZGVuY2UgaW4gdGhlIHRyZW5kIGVzdGltYXRlLg0KDQojIyBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjZm5haWQgPSBDRk5BSURJRkYNCg0KdHNfaW5mbyhDRk5BSURJRkYpDQoNCiNjb252ZXJ0IHRvIHRzDQpjZm5haWQgPC0gY2ZuYWlkWyIyMDEwLTAxLTAxLzIwMjQtMTAtMDEiXSB8PiB0c190cygpDQoNCmxlbmd0aChjZm5haWQpDQoNCiMgQ29udmVydCBjZm5haWQgdG8gYSBkYXRhIGZyYW1lIA0KY2ZuYWlkX2RmIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IERhdGUsIGNmbmFpZCA9IGFzLm51bWVyaWMoY2ZuYWlkWy1jKDEpXSkpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZzIgPSBnZ3Bsb3QoY2ZuYWlkX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBjZm5haWQpKSArDQogICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gIm9yYW5nZXJlZCIpKw0KICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImRhcmtyZWQiKSArDQogICAgICAgICAgZ2VvbV9zbW9vdGgoY29sb3VyID0gImRhcmtibHVlIikgKw0KICAgICAgICAgIGxhYnMoIHRpdGxlID0gIkNoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggd2l0aCBzbW9vdGhlciIpICsNCiAgICAgICAgICB4bGFiKCJNb250aHMiKSArDQogICAgICAgICAgeWxhYigiQ2hhbmdlIikrDQogICAgICAgICAgdGhlbWUoYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZT0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgZWxlbWVudF9ibGFuaygpKSArDQogICAgICAgICAgdGhlbWVfdHVmdGUoKQ0KDQpnMg0KYGBgDQoNClRoZW4gSSBnb3QgdGhlIGRhdGEgZm9yIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggZm9yDQp0aGUgc2FtZSBwZXJpb2QgKDIwMTAgLSAyMDI0KSBhcyBteSBVUyBFY29ub21pYyBEaWZmdXNpb24gSW5kZXggYW5kIHRoZW4gSSBhZGRlZA0KYSBzbW9vdGhlciB0byBpdC4gSXQgY2FuIGVhc2lseSBiZSBpbnRlcnByZXRlZCBieSBzdGF0aW5nIHRoYXQgQmV0d2VlbiAyMDEwIGFuZCANCjIwMTUsIHRoZSBpbmRleCBnZW5lcmFsbHkgdHJlbmRzIGRvd253YXJkcywgc3VnZ2VzdGluZyBwZXJpb2RzIG9mIHdlYWtlciANCmVjb25vbWljIGFjdGl2aXR5LiBGcm9tIDIwMTUgdG8gMjAyMCwgdGhlIGluZGV4IHNob3dzIG1vcmUgdm9sYXRpbGl0eSBidXQgd2l0aCBhIA0Kc2xpZ2h0IHVwd2FyZCB0cmVuZCwgaW5kaWNhdGluZyBtb2RlcmF0ZSBlY29ub21pYyBpbXByb3ZlbWVudC4gQXJvdW5kIDIwMjAsIA0KdGhlcmUncyBhIG5vdGFibGUgcGVhaywgZm9sbG93ZWQgYnkgYSBzaWduaWZpY2FudCBkZWNsaW5lIHBvc3QtMjAyMCwgcmVmbGVjdGluZyANCnRoZSBpbXBhY3Qgb2YgdGhlIENPVklELTE5IHBhbmRlbWljLg0KDQojDQoNCiMNCg0KIyMgSGVyZSBhcmUgdGhlIGJvdGggRGlmZnVzaW9uIEluZGV4IHBsb3RzIHdpdGggdGhlaXIgc21vb3RoZXJzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmlkLmFycmFuZ2UoZzEsIGcyLCBucm93ID0gMikNCmBgYA0KDQoNCg0KIyMgKGkpIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY29ycmVsYXRpb25fZGYgPSBjYmluZC5kYXRhLmZyYW1lKG15ZGF0YSxjZm5haWQpDQoNCmNvcnJlbGF0aW9uX2NvZWZmaWNpZW50ID0gY29yKGNvcnJlbGF0aW9uX2RmKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvcnJlbGF0aW9uX2NvZWZmaWNpZW50DQpgYGANCg0KVGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIG15IGVjb25vbWljIGluZGljYXRvcnMgYW5kIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IA0KSW5kZXg6IERpZmZ1c2lvbiBJbmRleCBhcmUgZ2VuZXJhbGx5IHdlYWsuIFRoaXMgaW1wbGllcyB0aGF0IHdoaWxlIHRoZXJlIGFyZSANCnNvbWUgbWlub3IgcmVsYXRpb25zaGlwcywgb3RoZXIgdmFyaWFibGVzIGxpa2VseSBwbGF5IGEgbW9yZSBzdWJzdGFudGlhbCByb2xlIGluIA0KaW5mbHVlbmNpbmcgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXguIA0KDQpTcGVjaWZpY2FsbHk6DQoNClRoZSB1bmVtcGxveW1lbnQgcmF0ZSBoYXMgYSBzbGlnaHRseSBwb3NpdGl2ZSgwLjE5NDc3NzA2KSBidXQgd2VhayBjb3JyZWxhdGlvbiANCndpdGggQ0ZOQUlESUZGLg0KDQpBdmVyYWdlIGhvdXJseSBlYXJuaW5ncygtMC4wNDM4NDE1NykgYW5kIENQSSgtMC4wNzIyNTUwMSkgaGF2ZSBuZWdsaWdpYmxlIA0KaW1wYWN0cyBvbiBDRk5BSURJRkYuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb3JycGxvdChjb3JyZWxhdGlvbl9jb2VmZmljaWVudCwgbWV0aG9kID0gImNvbG9yIikNCmBgYA0KDQpIZXJlIGlzIGEgaGVhdCBtYXAgdG8gdmlzdWFsbHkgcmVwcmVzZW50IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBteSBlY29ub21pYyANCmZhY3RvcnMgYW5kIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4Lg0KDQojDQoNCiMNCg0KIyMgKGlpKSBhIGdncGxvdCBvZiB0aGUgdHdvIHNlcmllcyBzaWRlIGJ5IHNpZGUuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjb21iaW5lZF9kYXRhIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IERhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleGAgPSBpbmRleCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleGAgPSBjZm5haWRbLTFdKSANCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChjb21iaW5lZF9kYXRhKSArIA0KICBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gVVMuRWNvbm9teS5EaWZmdXNpb24uSW5kZXgsIA0KICAgICAgICAgICAgICAgIGNvbG9yID0gIlVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IikpICsgDQogIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDaGljYWdvLkZlZC5OYXRpb25hbC5BY3Rpdml0eS5EaWZmdXNpb24uSW5kZXgsIA0KICAgICAgICAgICAgICAgIGNvbG9yID0gIkNoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleCIpKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJkYXJrcmVkIikgKyANCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpc29uIG9mIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IGFuZCBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiLCANCiAgICAgICB4ID0gIk1vbnRocyIsIHkgPSAiQ2hhbmdlIiwgY29sb3IgPSAgIkluZGV4IFR5cGUiKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXgiID0gImRhcmtibHVlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiID0gIm9yYW5nZXJlZCIpKSArIA0KICB0aGVtZShheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShzaXplID0gMC43NSwgY29sb3VyID0gImJsYWNrIikpICsNCiAgdGhlbWVfdHVmdGUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCg0KDQogICAgICAgIA0KYGBgDQoNCkluIHRoaXMgZ3JhcGggSSBhbSBjb21wYXJpbmcgdHdvIGtleSBlY29ub21pYyBpbmRpY2F0b3JzOiB0aGUgVVMgRWNvbm9teSANCkRpZmZ1c2lvbiBJbmRleCB0aGF0IEkgY3JlYXRlZCBhbmQgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiANCkluZGV4IChDRk5BSURJRkYpIGZyb20gMjAxMCB0byAyMDI0LiBCb3RoIGluZGljZXMgbWVhc3VyZSBjaGFuZ2VzIGluIGVjb25vbWljIA0KY29uZGl0aW9ucyBvdmVyIHRpbWUuDQoNClRoZSBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCBpcyByZXByZXNlbnRlZCBieSB0aGUgYmx1ZSBsaW5lIGl0IHNob3dzIGZyZXF1ZW50IA0KYW5kIHNoYXJwIGZsdWN0dWF0aW9ucy4gVGhpcyBpbmRpY2F0ZXMgYSBoaWdobHkgdm9sYXRpbGUgZWNvbm9taWMgZW52aXJvbm1lbnQgDQp3aGVyZSBjb25kaXRpb25zIGNhbiBjaGFuZ2UgcmFwaWRseS4gSW4gY29udHJhc3QsIHRoZSBDRk5BSURJRkYsIHNob3duIGJ5IHRoZSANCm9yYW5nZSBsaW5lIGl0IGhhcyBzbW9vdGhlciBhbmQgbGVzcyBleHRyZW1lIHZhcmlhdGlvbnMsIHN1Z2dlc3RpbmcgYSBtb3JlIA0Kc3RhYmxlIHBhdHRlcm4gb2YgZWNvbm9taWMgYWN0aXZpdHkuDQoNCkZyb20gMjAxMCB0byAyMDE1LCB0aGUgVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXggcmVmbGVjdHMgbW9yZSBwcm9ub3VuY2VkIHVwcyANCmFuZCBkb3ducywgc3VnZ2VzdGluZyBtb3JlIHJhcGlkIGNoYW5nZXMgaW4gdGhlIGVjb25vbXkuIE1lYW53aGlsZSwgdGhlIA0KQ0ZOQUlESUZGIG1haW50YWlucyBhIG1vcmUgY29uc2lzdGVudCwgZ3JhZHVhbCB0cmVuZC4gQXJvdW5kIDIwMjAsIHRoZXJlIGlzIGEgDQpub3RpY2VhYmxlIHBlYWsgaW4gdGhlIENGTkFJRElGRiBmb2xsb3dlZCBieSBhIGRlY2xpbmUsIGxpa2VseSByZWZsZWN0aW5nIHRoZSANCmVjb25vbWljIGltcGFjdCBvZiB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIFRoZSBibHVlIGxpbmUgYWxzbyBzaG93cyBzaWduaWZpY2FudCANCmFjdGl2aXR5IGFyb3VuZCB0aGlzIHBlcmlvZCwgaW5kaWNhdGluZyBzdWJzdGFudGlhbCBlY29ub21pYyBzaGlmdHMuIEFmdGVyIA0KdGhlIDIwMjAgcGVyaW9kIHRoZSBncmFwaCBzaG93cyB1cHMgYW5kIGRvd25zIGZvciBib3RoIHRoZSBpbmRpY2F0b3JzIGJ1dCB0aGUgVVMNCkVjb25vbWljIERpZmZ1c2lvbiBtb3N0bHkgc3RheXMgaW4gdGhlIHBvc2l0aXZlIHJlZ2lvbiB3aXRoIG9ubHkgYSBzaW5nbGUgDQpkZWNsaW5lIHRvIGEgbmVnYXRpdmUgcmVnaW9uLiBCdXQgZm9yIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gDQpJbmRleCAoQ0ZOQUlESUZGKSBpdCBmcmVxdWVudHkgZGlwcyB0byB0aGUgbmVnYXRpdmUgcmVnaW9uIGFuZCBzaG93cyBhIGRlY2xpbmluZyANCnRyZW5kIHdoaWNoIGNvbnRyYWRpY3RzIHdpdGggbXkgVVMgRWNvbm9taWMgRGlmZnVzaW9uIEluZGV4IHdoaWNoIHNob3dzIHNvbWUgDQpwb3NpdGl2ZSBncm93dGggdG93YXJkcyB0aGUgZW5kLg0KDQoNCiMjIENvbmNsdXNpb246DQpPdmVyYWxsLCB0aGlzIGNvbXBhcmlzb24gaGlnaGxpZ2h0cyB0aGUgZGlmZmVyZW5jZXMgaW4gdm9sYXRpbGl0eSBhbmQgc3RhYmlsaXR5IA0KYmV0d2VlbiB0aGUgdHdvIGluZGljZXMuIFdoaWxlIHRoZSBVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCBwb2ludHMgdG8gbW9yZSANCmltbWVkaWF0ZSBhbmQgZHJhbWF0aWMgZWNvbm9taWMgY2hhbmdlcywgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IA0KRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpIHByb3ZpZGVzIGEgc3RlYWRpZXIgcGVyc3BlY3RpdmUgb24gZWNvbm9taWMgdHJlbmRzLiANClRoaXMgYW5hbHlzaXMgY2FuIGhlbHAgdXMgdW5kZXJzdGFuZCB0aGUgbnVhbmNlcyBpbiBob3cgZGlmZmVyZW50IGVjb25vbWljIGluZGljYXRvcnMgDQpyZWZsZWN0IHRoZSBvdmVyYWxsIGhlYWx0aCBhbmQgYWN0aXZpdHkgb2YgdGhlIGVjb25vbXkuDQoNCiMjIFJlZnJlbmNlczoNCg0KaHR0cHM6Ly9mcmVkLnN0bG91aXNmZWQub3JnLyAoZGF0YSBzb3VyY2UpDQrigKIJVW5lbXBsb3ltZW50IFJhdGUgKFVOUkFURSkNCuKAoglBdmVyYWdlIEhvdXJseSBFYXJuaW5ncyBvZiBBbGwgRW1wbG95ZWVzIChDRVMwNTAwMDAwMDAzKQ0K4oCiCUNvbnN1bWVyIFByaWNlIEluZGV4IGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzIChDUElBVUNTTCkNCuKAoglDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpDQoNCmh0dHBzOi8vd3d3LmJyaWRnZWxlZ2FsZWNvbm9taWNzLmNvbS9yZXNvdXJjZXMvYmxvZyAoSW5zcGlyYXRpb24pDQoNCmh0dHBzOi8vYXJvZHMtZG9jcy5zaXRlNDQuY29tL0NUU2NvcmVjYXJkLmh0bWwgKFRlbXBsYXRlIGZvciB0aGUgY29tcGFyaXRpb24gcGxvdCkNCg0KDQoNCg0KDQoNCg0KDQoNCg==