library(data.table) #fread
library(plyr) #join
library(ggplot2) #ggplot, fortify
library(sp) #used by rgdal
library(rgdal) #readOGR
library(rgeos) #gCentroid
library(scales) #scale_fill_distiller, percent_format
library(ggmap) #theme_nothing
library(forecast) #autoplot ts
library(viridisLite)
library(viridis)

Author

City of Toronto Water Billing by Ward

Water Billing by Ward

CoT_Water_Consumption.ZIP

Water_Consumption_2000.xls - Water_Consumption_2015.xls

Volumes in cubic meters.

“city ward”, “year”, “residential accounts”, “annual residential usage”, “average residential usage”, “commercial accounts”, “annual commercial usage”, “average commercial usage”, “total count”, “total consumption”, “average consumption”

water_2000 <- fread("Water_Consumption_2000.csv")
water_2001 <- fread("Water_Consumption_2001.csv")
water_2002 <- fread("Water_Consumption_2002.csv")
water_2003 <- fread("Water_Consumption_2003.csv")
water_2004 <- fread("Water_Consumption_2004.csv")
water_2005 <- fread("Water_Consumption_2005.csv")
water_2006 <- fread("Water_Consumption_2006.csv")
water_2007 <- fread("Water_Consumption_2007.csv")
water_2008 <- fread("Water_Consumption_2008.csv")
water_2009 <- fread("Water_Consumption_2009.csv")
water_2010 <- fread("Water_Consumption_2010.csv")
water_2011 <- fread("Water_Consumption_2011.csv")
water_2012 <- fread("Water_Consumption_2012.csv")
water_2013 <- fread("Water_Consumption_2013.csv")
water_2014 <- fread("Water_Consumption_2014.csv")
water_2015 <- fread("Water_Consumption_2015.csv")
v <- c("id", "year", "residential_accounts", "annual_residential_usage",
"average_residential_usage", "commercial_accounts", "annual_commercial_usage",
"average_commercial_usage", "total_count", "total_consumption", "average_consumption")

setnames(water_2000, v)
setnames(water_2001, v)
setnames(water_2002, v)
setnames(water_2003, v)
setnames(water_2004, v)
setnames(water_2005, v)
setnames(water_2006, v)
setnames(water_2007, v)
setnames(water_2008, v)
setnames(water_2009, v)
setnames(water_2010, v)
setnames(water_2011, v)
setnames(water_2012, v)
setnames(water_2013, v)
setnames(water_2014, v)
setnames(water_2015, v)
head(water_2015)

Shapefile

wards.sh <- readOGR("C:/Users/14165/Desktop/Shapefiles/May2010_WGS84", "icitw_wgs84")
OGR data source with driver: ESRI Shapefile 
Source: "C:\Users\14165\Desktop\Shapefiles\May2010_WGS84", layer: "icitw_wgs84"
with 44 features
It has 10 fields

Add “id” column

wards.sh@data$id <- as.integer(wards.sh@data$SCODE_NAME)

Make centroids of each ward, for placing labels when plotting

wards.centroids  <- as.data.frame(gCentroid(wards.sh, byid = TRUE))

Add “id” column

wards.centroids$id <- wards.sh@data$id

Shapefile processing

wards.points = fortify(wards.sh, region="id")

wards.df = join(wards.points, wards.sh@data, by="id")

Choropleths

wards.water_2015 <- merge(wards.df, water_2015, by = "id")

p.2015_residential <- ggplot() + 
  geom_polygon(data = wards.water_2015,
               aes(x = long, y = lat, group = group, fill = average_residential_usage),
               color = "black", size = 0.25) +  
  coord_map() + 
  scale_fill_distiller(name="Cubic meters/account", palette = "Blues", trans = "reverse", breaks = pretty_breaks(n = 8)) + 
  theme_nothing(legend = TRUE) + 
  labs(title="Average annual residential water use per account by ward, 2015") + 
  geom_text(aes(x=x, y=y, group=NULL, label=id), data = wards.centroids, size = 2)

p.2015_residential + guides(fill = guide_legend(reverse = TRUE))

p.2015_commercial <- ggplot() + 
  geom_polygon(data = wards.water_2015,
               aes(x = long, y = lat, group = group, fill = average_commercial_usage),
               color = "black", size = 0.25) +  
  coord_map() + 
  scale_fill_distiller(name="Cubic meters/account", palette = "Blues", trans = "reverse", breaks = pretty_breaks(n = 8)) + 
  theme_nothing(legend = TRUE) + 
  labs(title="Average annual commercial water use per account by ward, 2015") + 
  geom_text(aes(x=x, y=y, group=NULL, label=id), data = wards.centroids, size = 2)

p.2015_commercial + guides(fill = guide_legend(reverse = TRUE))

water_2015$average_residential_usage_change <- (water_2015$average_residential_usage-water_2000$average_residential_usage)/water_2000$average_residential_usage

water_2015$average_commercial_usage_change <- (water_2015$average_commercial_usage-water_2000$average_commercial_usage)/water_2000$average_commercial_usage
wards.water_2015 <- merge(wards.df, water_2015, by = "id")

p.residential_change <- ggplot() + 
  geom_polygon(data = wards.water_2015,
               aes(x = long, y = lat, group = group, fill = average_residential_usage_change),
               color = "black", size = 0.25) +  
  coord_map() + 
  scale_fill_viridis(option="magma", labels=percent, name="Change") + 
  theme_nothing(legend = TRUE) + 
  labs(title="Change in Average Annual Residential Water Usage, 2000-2015") + 
  geom_text(aes(x=x, y=y, group=NULL, label=id), data = wards.centroids, size = 2)

p.residential_change + guides(fill = guide_legend(reverse = TRUE))

p.commercial_change <- ggplot() + 
  geom_polygon(data = wards.water_2015,
               aes(x = long, y = lat, group = group, fill = average_commercial_usage_change),
               color = "black", size = 0.25) +  
  coord_map() + 
  scale_fill_viridis(option="magma", labels=percent, name="Change") + 
  theme_nothing(legend = TRUE) + 
  labs(title="Change in Average Annual Commercial Water Usage, 2000-2015") + 
  geom_text(aes(x=x, y=y, group=NULL, label=id), data = wards.centroids, size = 2)

p.commercial_change + guides(fill = guide_legend(reverse = TRUE))

Time Series

commercial_accounts_2000 <- sum(water_2000$commercial_accounts)
  
commercial_usage_2000 <- sum(water_2000$annual_commercial_usage)

commercial_accounts_2001 <- sum(water_2001$commercial_accounts)
  
commercial_usage_2001 <- sum(water_2001$annual_commercial_usage)

commercial_accounts_2002 <- sum(water_2002$commercial_accounts)
  
commercial_usage_2002 <- sum(water_2002$annual_commercial_usage)

commercial_accounts_2003 <- sum(water_2003$commercial_accounts)
  
commercial_usage_2003 <- sum(water_2003$annual_commercial_usage)

commercial_accounts_2004 <- sum(water_2005$commercial_accounts)
  
commercial_usage_2004 <- sum(water_2004$annual_commercial_usage)

commercial_accounts_2005 <- sum(water_2005$commercial_accounts)
  
commercial_usage_2005 <- sum(water_2005$annual_commercial_usage)

commercial_accounts_2006 <- sum(water_2006$commercial_accounts)
  
commercial_usage_2006 <- sum(water_2007$annual_commercial_usage)

commercial_accounts_2007 <- sum(water_2007$commercial_accounts)
  
commercial_usage_2007 <- sum(water_2007$annual_commercial_usage)

commercial_accounts_2008 <- sum(water_2008$commercial_accounts)
  
commercial_usage_2008 <- sum(water_2008$annual_commercial_usage)

commercial_accounts_2009 <- sum(water_2009$commercial_accounts)
  
commercial_usage_2009 <- sum(water_2009$annual_commercial_usage)

commercial_accounts_2010 <- sum(water_2010$commercial_accounts)
  
commercial_usage_2010 <- sum(water_2010$annual_commercial_usage)

commercial_accounts_2011 <- sum(water_2011$commercial_accounts)
  
commercial_usage_2011 <- sum(water_2011$annual_commercial_usage)

commercial_accounts_2012 <- sum(water_2012$commercial_accounts)
  
commercial_usage_2012 <- sum(water_2012$annual_commercial_usage)

commercial_accounts_2013 <- sum(water_2013$commercial_accounts)
  
commercial_usage_2013 <- sum(water_2013$annual_commercial_usage)

commercial_accounts_2014 <- sum(water_2014$commercial_accounts)
  
commercial_usage_2014 <- sum(water_2014$annual_commercial_usage)

commercial_accounts_2015 <- sum(water_2015$commercial_accounts)
  
commercial_usage_2015 <- sum(water_2015$annual_commercial_usage)
commercial_accounts <- c(commercial_accounts_2000, commercial_accounts_2001, commercial_accounts_2002,
                         commercial_accounts_2003, commercial_accounts_2004, commercial_accounts_2005,
                         commercial_accounts_2006, commercial_accounts_2007, commercial_accounts_2008,
                         commercial_accounts_2009, commercial_accounts_2010, commercial_accounts_2011,
                         commercial_accounts_2012, commercial_accounts_2013, commercial_accounts_2014,
                         commercial_accounts_2015)

commercial_usage <- c(commercial_usage_2000, commercial_usage_2001, commercial_usage_2002,
                      commercial_usage_2003, commercial_usage_2004, commercial_usage_2005,
                      commercial_usage_2006, commercial_usage_2007, commercial_usage_2008,
                      commercial_usage_2009, commercial_usage_2010, commercial_usage_2011,
                      commercial_usage_2012, commercial_usage_2013, commercial_usage_2014,
                      commercial_usage_2015)
average_commercial_usage <- commercial_usage/commercial_accounts
commercial_usage.ts <- ts(commercial_usage, start=2000, frequency=1)
plot(commercial_usage.ts, main = "Total Annual Commercial Usage, cubic meters")

average_commercial_usage.ts <- ts(average_commercial_usage, start=2000, frequency=1)
plot(average_commercial_usage.ts, main = "Average Annual Commercial Usage, cubic meters")

Biennial Drinking Water Plants Survey (DKWP)

Potable water use by sector and average daily use

Table: 38-10-0271-01 (formerly CANSIM 153-0127)

3810027101_databaseLoadingData.csv

DKWP_Ontario_use <- fread("3810027101_databaseLoadingData.csv")

str(DKWP_Ontario_use)
Classes ‘data.table’ and 'data.frame':  36 obs. of  15 variables:
 $ REF_DATE                            : int  2011 2013 2015 2017 2011 2013 2015 2017 2011 2013 ...
 $ GEO                                 : chr  "Ontario" "Ontario" "Ontario" "Ontario" ...
 $ DGUID                               : chr  "2016A000235" "2016A000235" "2016A000235" "2016A000235" ...
 $ Characteristics of potable water use: chr  "Total potable water volume, all sectors of use" "Total potable water volume, all sectors of use" "Total potable water volume, all sectors of use" "Total potable water volume, all sectors of use" ...
 $ UOM                                 : chr  "Cubic metres" "Cubic metres" "Cubic metres" "Cubic metres" ...
 $ UOM_ID                              : int  72 72 72 72 72 72 72 72 72 72 ...
 $ SCALAR_FACTOR                       : chr  "millions" "millions" "millions" "millions" ...
 $ SCALAR_ID                           : int  6 6 6 6 6 6 6 6 6 6 ...
 $ VECTOR                              : chr  "v91504442" "v91504442" "v91504442" "v91504442" ...
 $ COORDINATE                          : num  7.1 7.1 7.1 7.1 7.2 7.2 7.2 7.2 7.3 7.3 ...
 $ VALUE                               : num  1670 1628 1623 1576 793 ...
 $ STATUS                              : chr  "A" "A" "A" "A" ...
 $ SYMBOL                              : logi  NA NA NA NA NA NA ...
 $ TERMINATED                          : logi  NA NA NA NA NA NA ...
 $ DECIMALS                            : int  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, ".internal.selfref")=<externalptr> 
unique(DKWP_Ontario_use$`Characteristics of potable water use`)
[1] "Total potable water volume, all sectors of use"                         
[2] "Residential sector"                                                     
[3] "Industrial, commercial, institutional and other non-residential sectors"
[4] "Losses from the distribution system"                                    
[5] "Wholesale water provided to other jurisdictions"                        
[6] "Sector of use unknown"                                                  
[7] "Average daily total use per capita of the population served"            
[8] "Average daily residential use per capita of the population served"      
[9] "Responding population served for the average daily residential use"     
DKWP_Ontario_average_daily_per_capita <- DKWP_Ontario_use[`Characteristics of potable water use`=="Average daily total use per capita of the population served", .(Year = REF_DATE, Average_daily_per_capita_liters = VALUE)]

DKWP_Ontario_average_residential <- DKWP_Ontario_use[`Characteristics of potable water use`=="Average daily residential use per capita of the population served", .(Year = REF_DATE, Average_daily_residential_liters = VALUE)]
DKWP_Ontario_average_daily_per_capita
DKWP_Ontario_average_residential

Potable water volumes processed by drinking water plants, by month (x 1,000,000)

Table: 38-10-0272-01 (formerly CANSIM 153-0124)

3810027201_databaseLoadingData.csv

DKWP_Ontario_processed <- fread("3810027201_databaseLoadingData.csv")

VALUE = millions cubic meters

str(DKWP_Ontario_processed)
Classes ‘data.table’ and 'data.frame':  84 obs. of  15 variables:
 $ REF_DATE     : int  2005 2006 2007 2011 2013 2015 2017 2005 2006 2007 ...
 $ GEO          : chr  "Ontario" "Ontario" "Ontario" "Ontario" ...
 $ DGUID        : chr  "2016A000235" "2016A000235" "2016A000235" "2016A000235" ...
 $ Month        : chr  "January" "January" "January" "January" ...
 $ UOM          : chr  "Cubic metres" "Cubic metres" "Cubic metres" "Cubic metres" ...
 $ UOM_ID       : int  72 72 72 72 72 72 72 72 72 72 ...
 $ SCALAR_FACTOR: chr  "millions" "millions" "millions" "millions" ...
 $ SCALAR_ID    : int  6 6 6 6 6 6 6 6 6 6 ...
 $ VECTOR       : chr  "v91412803" "v91412803" "v91412803" "v91412803" ...
 $ COORDINATE   : num  7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.3 7.3 7.3 ...
 $ VALUE        : num  144 141 141 129 130 ...
 $ STATUS       : chr  "A" "A" "A" "A" ...
 $ SYMBOL       : logi  NA NA NA NA NA NA ...
 $ TERMINATED   : logi  NA NA NA NA NA NA ...
 $ DECIMALS     : int  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, ".internal.selfref")=<externalptr> 
DKWP_Ontario_processed$Month <- match(DKWP_Ontario_processed$Month, month.name)

str(DKWP_Ontario_processed)
Classes ‘data.table’ and 'data.frame':  84 obs. of  15 variables:
 $ REF_DATE     : int  2005 2006 2007 2011 2013 2015 2017 2005 2006 2007 ...
 $ GEO          : chr  "Ontario" "Ontario" "Ontario" "Ontario" ...
 $ DGUID        : chr  "2016A000235" "2016A000235" "2016A000235" "2016A000235" ...
 $ Month        : int  1 1 1 1 1 1 1 2 2 2 ...
 $ UOM          : chr  "Cubic metres" "Cubic metres" "Cubic metres" "Cubic metres" ...
 $ UOM_ID       : int  72 72 72 72 72 72 72 72 72 72 ...
 $ SCALAR_FACTOR: chr  "millions" "millions" "millions" "millions" ...
 $ SCALAR_ID    : int  6 6 6 6 6 6 6 6 6 6 ...
 $ VECTOR       : chr  "v91412803" "v91412803" "v91412803" "v91412803" ...
 $ COORDINATE   : num  7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.3 7.3 7.3 ...
 $ VALUE        : num  144 141 141 129 130 ...
 $ STATUS       : chr  "A" "A" "A" "A" ...
 $ SYMBOL       : logi  NA NA NA NA NA NA ...
 $ TERMINATED   : logi  NA NA NA NA NA NA ...
 $ DECIMALS     : int  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, ".internal.selfref")=<externalptr> 
DKWP_Ontario_processed_volumes <- DKWP_Ontario_processed[,.(Volume = VALUE), by = .(Year = REF_DATE, Month)]

DKWP_Ontario_processed_volumes <- DKWP_Ontario_processed_volumes[order(Year,Month)]

str(DKWP_Ontario_processed_volumes)
Classes ‘data.table’ and 'data.frame':  84 obs. of  3 variables:
 $ Year  : int  2005 2005 2005 2005 2005 2005 2005 2005 2005 2005 ...
 $ Month : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Volume: num  144 130 145 141 157 ...
 - attr(*, ".internal.selfref")=<externalptr> 
DKWP_Ontario_processed_volumes.ts <- ts(DKWP_Ontario_processed_volumes$Volume, start = 2005, frequency = 12)
DKWP_Ontario_processed_volumes.ts.components <- decompose(DKWP_Ontario_processed_volumes.ts)

autoplot(DKWP_Ontario_processed_volumes.ts.components)

Wastewater volumes processed by municipal sewage systems (x 1,000,000)

Table: 38-10-0099-01

3810009901_databaseLoadingData.csv

VALUE = millions cubic meters

DKWP_Ontario_wastewater <- fread("3810009901_databaseLoadingData.csv")

str(DKWP_Ontario_wastewater)
Classes ‘data.table’ and 'data.frame':  60 obs. of  15 variables:
 $ REF_DATE     : int  2013 2014 2015 2016 2017 2013 2014 2015 2016 2017 ...
 $ GEO          : chr  "Ontario" "Ontario" "Ontario" "Ontario" ...
 $ DGUID        : chr  "2016A000235" "2016A000235" "2016A000235" "2016A000235" ...
 $ Month        : chr  "January" "January" "January" "January" ...
 $ UOM          : chr  "Cubic metres" "Cubic metres" "Cubic metres" "Cubic metres" ...
 $ UOM_ID       : int  72 72 72 72 72 72 72 72 72 72 ...
 $ SCALAR_FACTOR: chr  "millions" "millions" "millions" "millions" ...
 $ SCALAR_ID    : int  6 6 6 6 6 6 6 6 6 6 ...
 $ VECTOR       : chr  "v1064171257" "v1064171257" "v1064171257" "v1064171257" ...
 $ COORDINATE   : num  7.2 7.2 7.2 7.2 7.2 7.3 7.3 7.3 7.3 7.3 ...
 $ VALUE        : num  175 161 147 158 167 ...
 $ STATUS       : chr  "B" "B" "B" "B" ...
 $ SYMBOL       : logi  NA NA NA NA NA NA ...
 $ TERMINATED   : logi  NA NA NA NA NA NA ...
 $ DECIMALS     : int  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, ".internal.selfref")=<externalptr> 
DKWP_Ontario_wastewater$Month <- match(DKWP_Ontario_wastewater$Month, month.name)

DKWP_Ontario_wastewater_volumes <- DKWP_Ontario_wastewater[,.(Volume = VALUE), by = .(Year = REF_DATE, Month)]

DKWP_Ontario_wastewater_volumes <- DKWP_Ontario_wastewater_volumes[order(Year,Month)]

DKWP_Ontario_wastewater_volumes.ts <- ts(DKWP_Ontario_wastewater_volumes$Volume, start = 2013, frequency = 12)

DKWP_Ontario_wastewater_volumes.ts.components <- decompose(DKWP_Ontario_wastewater_volumes.ts)

autoplot(DKWP_Ontario_wastewater_volumes.ts.components)

Further resources

Ontario Municipal Wastewater

Municipal treated wastewater effluent

Data contains flows and effluent quality from our municipal wastewater treatment plants.

MWD2008.xlsx - MWD2016.xlsx

City of Toronto, 2019

Water Consumption Report

MPMP Multi-Year Report

MPMP Multi-Year Report - By Municipality

Toronto C 26-Jan-17: MPMP-MULTI-YR-Toronto C.xls

e.g.

SLC 91 3112 45 b) Total costs for the treatment and disposal of wastewater per megalitre.

SLC 91 3311 45 b) Total costs for the treatment of drinking water per megalitre.

Statistics Canada

2011 Municipal Water Use Report – Municipal Water Use 2009 Statistics, Table 2: Total and Residential per Capita Water Use, by Province/Territory and Municipal Population

LS0tDQp0aXRsZTogIlRvcm9udG8gV2F0ZXIgQ29uc3VtcHRpb24sIDIwMDAtMjAxNSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KGRhdGEudGFibGUpICNmcmVhZA0KbGlicmFyeShwbHlyKSAjam9pbg0KbGlicmFyeShnZ3Bsb3QyKSAjZ2dwbG90LCBmb3J0aWZ5DQpsaWJyYXJ5KHNwKSAjdXNlZCBieSByZ2RhbA0KbGlicmFyeShyZ2RhbCkgI3JlYWRPR1INCmxpYnJhcnkocmdlb3MpICNnQ2VudHJvaWQNCmxpYnJhcnkoc2NhbGVzKSAjc2NhbGVfZmlsbF9kaXN0aWxsZXIsIHBlcmNlbnRfZm9ybWF0DQpsaWJyYXJ5KGdnbWFwKSAjdGhlbWVfbm90aGluZw0KbGlicmFyeShmb3JlY2FzdCkgI2F1dG9wbG90IHRzDQpsaWJyYXJ5KHZpcmlkaXNMaXRlKQ0KbGlicmFyeSh2aXJpZGlzKQ0KYGBgDQoNCiMgQXV0aG9yDQoNCiogSm9yZGFuIEJlbGwNCiogSnVseSAxMCwgMjAxOQ0KKiA8aHR0cHM6Ly9qb3JkYW5iZWxsMjM1Ny5naXRodWIuaW8vVG9yb250b19XYXRlci5uYi5odG1sPg0KDQojIENpdHkgb2YgVG9yb250byBXYXRlciBCaWxsaW5nIGJ5IFdhcmQNCg0KW1dhdGVyIEJpbGxpbmcgYnkgV2FyZF0oaHR0cHM6Ly93d3cudG9yb250by5jYS9jaXR5LWdvdmVybm1lbnQvZGF0YS1yZXNlYXJjaC1tYXBzL29wZW4tZGF0YS9vcGVuLWRhdGEtY2F0YWxvZ3VlLyNlMmI0MTljMy1hOGE4LTc5NDktZDgwZC0wMjU4NWY0ODMyZjUpDQoNCkNvVF9XYXRlcl9Db25zdW1wdGlvbi5aSVANCg0KV2F0ZXJfQ29uc3VtcHRpb25fMjAwMC54bHMgLSBXYXRlcl9Db25zdW1wdGlvbl8yMDE1Lnhscw0KDQpWb2x1bWVzIGluIGN1YmljIG1ldGVycy4NCg0KImNpdHkgd2FyZCIsICJ5ZWFyIiwgInJlc2lkZW50aWFsIGFjY291bnRzIiwgImFubnVhbCByZXNpZGVudGlhbCB1c2FnZSIsDQoiYXZlcmFnZSByZXNpZGVudGlhbCB1c2FnZSIsICJjb21tZXJjaWFsIGFjY291bnRzIiwgImFubnVhbCBjb21tZXJjaWFsIHVzYWdlIiwNCiJhdmVyYWdlIGNvbW1lcmNpYWwgdXNhZ2UiLCAidG90YWwgY291bnQiLCAidG90YWwgY29uc3VtcHRpb24iLCAiYXZlcmFnZSBjb25zdW1wdGlvbiINCg0KYGBge3J9DQp3YXRlcl8yMDAwIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDAwLmNzdiIpDQp3YXRlcl8yMDAxIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDAxLmNzdiIpDQp3YXRlcl8yMDAyIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDAyLmNzdiIpDQp3YXRlcl8yMDAzIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDAzLmNzdiIpDQp3YXRlcl8yMDA0IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA0LmNzdiIpDQp3YXRlcl8yMDA1IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA1LmNzdiIpDQp3YXRlcl8yMDA2IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA2LmNzdiIpDQp3YXRlcl8yMDA3IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA3LmNzdiIpDQp3YXRlcl8yMDA4IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA4LmNzdiIpDQp3YXRlcl8yMDA5IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDA5LmNzdiIpDQp3YXRlcl8yMDEwIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDEwLmNzdiIpDQp3YXRlcl8yMDExIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDExLmNzdiIpDQp3YXRlcl8yMDEyIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDEyLmNzdiIpDQp3YXRlcl8yMDEzIDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDEzLmNzdiIpDQp3YXRlcl8yMDE0IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDE0LmNzdiIpDQp3YXRlcl8yMDE1IDwtIGZyZWFkKCJXYXRlcl9Db25zdW1wdGlvbl8yMDE1LmNzdiIpDQpgYGANCg0KYGBge3J9DQp2IDwtIGMoImlkIiwgInllYXIiLCAicmVzaWRlbnRpYWxfYWNjb3VudHMiLCAiYW5udWFsX3Jlc2lkZW50aWFsX3VzYWdlIiwNCiJhdmVyYWdlX3Jlc2lkZW50aWFsX3VzYWdlIiwgImNvbW1lcmNpYWxfYWNjb3VudHMiLCAiYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UiLA0KImF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZSIsICJ0b3RhbF9jb3VudCIsICJ0b3RhbF9jb25zdW1wdGlvbiIsICJhdmVyYWdlX2NvbnN1bXB0aW9uIikNCg0Kc2V0bmFtZXMod2F0ZXJfMjAwMCwgdikNCnNldG5hbWVzKHdhdGVyXzIwMDEsIHYpDQpzZXRuYW1lcyh3YXRlcl8yMDAyLCB2KQ0Kc2V0bmFtZXMod2F0ZXJfMjAwMywgdikNCnNldG5hbWVzKHdhdGVyXzIwMDQsIHYpDQpzZXRuYW1lcyh3YXRlcl8yMDA1LCB2KQ0Kc2V0bmFtZXMod2F0ZXJfMjAwNiwgdikNCnNldG5hbWVzKHdhdGVyXzIwMDcsIHYpDQpzZXRuYW1lcyh3YXRlcl8yMDA4LCB2KQ0Kc2V0bmFtZXMod2F0ZXJfMjAwOSwgdikNCnNldG5hbWVzKHdhdGVyXzIwMTAsIHYpDQpzZXRuYW1lcyh3YXRlcl8yMDExLCB2KQ0Kc2V0bmFtZXMod2F0ZXJfMjAxMiwgdikNCnNldG5hbWVzKHdhdGVyXzIwMTMsIHYpDQpzZXRuYW1lcyh3YXRlcl8yMDE0LCB2KQ0Kc2V0bmFtZXMod2F0ZXJfMjAxNSwgdikNCmBgYA0KDQpgYGB7cn0NCmhlYWQod2F0ZXJfMjAxNSkNCmBgYA0KDQojIyBTaGFwZWZpbGUNCg0KYGBge3J9DQp3YXJkcy5zaCA8LSByZWFkT0dSKCJDOi9Vc2Vycy8xNDE2NS9EZXNrdG9wL1NoYXBlZmlsZXMvTWF5MjAxMF9XR1M4NCIsICJpY2l0d193Z3M4NCIpDQpgYGANCg0KQWRkICJpZCIgY29sdW1uDQpgYGB7cn0NCndhcmRzLnNoQGRhdGEkaWQgPC0gYXMuaW50ZWdlcih3YXJkcy5zaEBkYXRhJFNDT0RFX05BTUUpDQpgYGANCg0KTWFrZSBjZW50cm9pZHMgb2YgZWFjaCB3YXJkLCBmb3IgcGxhY2luZyBsYWJlbHMgd2hlbiBwbG90dGluZw0KYGBge3J9DQp3YXJkcy5jZW50cm9pZHMgIDwtIGFzLmRhdGEuZnJhbWUoZ0NlbnRyb2lkKHdhcmRzLnNoLCBieWlkID0gVFJVRSkpDQpgYGANCg0KQWRkICJpZCIgY29sdW1uDQpgYGB7cn0NCndhcmRzLmNlbnRyb2lkcyRpZCA8LSB3YXJkcy5zaEBkYXRhJGlkDQpgYGANCg0KU2hhcGVmaWxlIHByb2Nlc3NpbmcNCmBgYHtyfQ0Kd2FyZHMucG9pbnRzID0gZm9ydGlmeSh3YXJkcy5zaCwgcmVnaW9uPSJpZCIpDQoNCndhcmRzLmRmID0gam9pbih3YXJkcy5wb2ludHMsIHdhcmRzLnNoQGRhdGEsIGJ5PSJpZCIpDQpgYGANCg0KDQojIyBDaG9yb3BsZXRocw0KDQpgYGB7cn0NCndhcmRzLndhdGVyXzIwMTUgPC0gbWVyZ2Uod2FyZHMuZGYsIHdhdGVyXzIwMTUsIGJ5ID0gImlkIikNCg0KcC4yMDE1X3Jlc2lkZW50aWFsIDwtIGdncGxvdCgpICsgDQogIGdlb21fcG9seWdvbihkYXRhID0gd2FyZHMud2F0ZXJfMjAxNSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGF2ZXJhZ2VfcmVzaWRlbnRpYWxfdXNhZ2UpLA0KICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yNSkgKyAgDQogIGNvb3JkX21hcCgpICsgDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKG5hbWU9IkN1YmljIG1ldGVycy9hY2NvdW50IiwgcGFsZXR0ZSA9ICJCbHVlcyIsIHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSBwcmV0dHlfYnJlYWtzKG4gPSA4KSkgKyANCiAgdGhlbWVfbm90aGluZyhsZWdlbmQgPSBUUlVFKSArIA0KICBsYWJzKHRpdGxlPSJBdmVyYWdlIGFubnVhbCByZXNpZGVudGlhbCB3YXRlciB1c2UgcGVyIGFjY291bnQgYnkgd2FyZCwgMjAxNSIpICsgDQogIGdlb21fdGV4dChhZXMoeD14LCB5PXksIGdyb3VwPU5VTEwsIGxhYmVsPWlkKSwgZGF0YSA9IHdhcmRzLmNlbnRyb2lkcywgc2l6ZSA9IDIpDQoNCnAuMjAxNV9yZXNpZGVudGlhbCArIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkNCmBgYA0KDQpgYGB7cn0NCnAuMjAxNV9jb21tZXJjaWFsIDwtIGdncGxvdCgpICsgDQogIGdlb21fcG9seWdvbihkYXRhID0gd2FyZHMud2F0ZXJfMjAxNSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZSksDQogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjI1KSArICANCiAgY29vcmRfbWFwKCkgKyANCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIobmFtZT0iQ3ViaWMgbWV0ZXJzL2FjY291bnQiLCBwYWxldHRlID0gIkJsdWVzIiwgdHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IHByZXR0eV9icmVha3MobiA9IDgpKSArIA0KICB0aGVtZV9ub3RoaW5nKGxlZ2VuZCA9IFRSVUUpICsgDQogIGxhYnModGl0bGU9IkF2ZXJhZ2UgYW5udWFsIGNvbW1lcmNpYWwgd2F0ZXIgdXNlIHBlciBhY2NvdW50IGJ5IHdhcmQsIDIwMTUiKSArIA0KICBnZW9tX3RleHQoYWVzKHg9eCwgeT15LCBncm91cD1OVUxMLCBsYWJlbD1pZCksIGRhdGEgPSB3YXJkcy5jZW50cm9pZHMsIHNpemUgPSAyKQ0KDQpwLjIwMTVfY29tbWVyY2lhbCArIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkNCmBgYA0KDQpgYGB7cn0NCndhdGVyXzIwMTUkYXZlcmFnZV9yZXNpZGVudGlhbF91c2FnZV9jaGFuZ2UgPC0gKHdhdGVyXzIwMTUkYXZlcmFnZV9yZXNpZGVudGlhbF91c2FnZS13YXRlcl8yMDAwJGF2ZXJhZ2VfcmVzaWRlbnRpYWxfdXNhZ2UpL3dhdGVyXzIwMDAkYXZlcmFnZV9yZXNpZGVudGlhbF91c2FnZQ0KDQp3YXRlcl8yMDE1JGF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZV9jaGFuZ2UgPC0gKHdhdGVyXzIwMTUkYXZlcmFnZV9jb21tZXJjaWFsX3VzYWdlLXdhdGVyXzIwMDAkYXZlcmFnZV9jb21tZXJjaWFsX3VzYWdlKS93YXRlcl8yMDAwJGF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZQ0KYGBgDQoNCmBgYHtyfQ0Kd2FyZHMud2F0ZXJfMjAxNSA8LSBtZXJnZSh3YXJkcy5kZiwgd2F0ZXJfMjAxNSwgYnkgPSAiaWQiKQ0KDQpwLnJlc2lkZW50aWFsX2NoYW5nZSA8LSBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvbHlnb24oZGF0YSA9IHdhcmRzLndhdGVyXzIwMTUsDQogICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBhdmVyYWdlX3Jlc2lkZW50aWFsX3VzYWdlX2NoYW5nZSksDQogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjI1KSArICANCiAgY29vcmRfbWFwKCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbj0ibWFnbWEiLCBsYWJlbHM9cGVyY2VudCwgbmFtZT0iQ2hhbmdlIikgKyANCiAgdGhlbWVfbm90aGluZyhsZWdlbmQgPSBUUlVFKSArIA0KICBsYWJzKHRpdGxlPSJDaGFuZ2UgaW4gQXZlcmFnZSBBbm51YWwgUmVzaWRlbnRpYWwgV2F0ZXIgVXNhZ2UsIDIwMDAtMjAxNSIpICsgDQogIGdlb21fdGV4dChhZXMoeD14LCB5PXksIGdyb3VwPU5VTEwsIGxhYmVsPWlkKSwgZGF0YSA9IHdhcmRzLmNlbnRyb2lkcywgc2l6ZSA9IDIpDQoNCnAucmVzaWRlbnRpYWxfY2hhbmdlICsgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKQ0KYGBgDQoNCmBgYHtyfQ0KcC5jb21tZXJjaWFsX2NoYW5nZSA8LSBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvbHlnb24oZGF0YSA9IHdhcmRzLndhdGVyXzIwMTUsDQogICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBhdmVyYWdlX2NvbW1lcmNpYWxfdXNhZ2VfY2hhbmdlKSwNCiAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMjUpICsgIA0KICBjb29yZF9tYXAoKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uPSJtYWdtYSIsIGxhYmVscz1wZXJjZW50LCBuYW1lPSJDaGFuZ2UiKSArIA0KICB0aGVtZV9ub3RoaW5nKGxlZ2VuZCA9IFRSVUUpICsgDQogIGxhYnModGl0bGU9IkNoYW5nZSBpbiBBdmVyYWdlIEFubnVhbCBDb21tZXJjaWFsIFdhdGVyIFVzYWdlLCAyMDAwLTIwMTUiKSArIA0KICBnZW9tX3RleHQoYWVzKHg9eCwgeT15LCBncm91cD1OVUxMLCBsYWJlbD1pZCksIGRhdGEgPSB3YXJkcy5jZW50cm9pZHMsIHNpemUgPSAyKQ0KDQpwLmNvbW1lcmNpYWxfY2hhbmdlICsgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKQ0KYGBgDQoNCg0KIyMgVGltZSBTZXJpZXMNCg0KYGBge3J9DQpjb21tZXJjaWFsX2FjY291bnRzXzIwMDAgPC0gc3VtKHdhdGVyXzIwMDAkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMDAgPC0gc3VtKHdhdGVyXzIwMDAkYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQoNCmNvbW1lcmNpYWxfYWNjb3VudHNfMjAwMSA8LSBzdW0od2F0ZXJfMjAwMSRjb21tZXJjaWFsX2FjY291bnRzKQ0KICANCmNvbW1lcmNpYWxfdXNhZ2VfMjAwMSA8LSBzdW0od2F0ZXJfMjAwMSRhbm51YWxfY29tbWVyY2lhbF91c2FnZSkNCg0KY29tbWVyY2lhbF9hY2NvdW50c18yMDAyIDwtIHN1bSh3YXRlcl8yMDAyJGNvbW1lcmNpYWxfYWNjb3VudHMpDQogIA0KY29tbWVyY2lhbF91c2FnZV8yMDAyIDwtIHN1bSh3YXRlcl8yMDAyJGFubnVhbF9jb21tZXJjaWFsX3VzYWdlKQ0KDQpjb21tZXJjaWFsX2FjY291bnRzXzIwMDMgPC0gc3VtKHdhdGVyXzIwMDMkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMDMgPC0gc3VtKHdhdGVyXzIwMDMkYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQoNCmNvbW1lcmNpYWxfYWNjb3VudHNfMjAwNCA8LSBzdW0od2F0ZXJfMjAwNSRjb21tZXJjaWFsX2FjY291bnRzKQ0KICANCmNvbW1lcmNpYWxfdXNhZ2VfMjAwNCA8LSBzdW0od2F0ZXJfMjAwNCRhbm51YWxfY29tbWVyY2lhbF91c2FnZSkNCg0KY29tbWVyY2lhbF9hY2NvdW50c18yMDA1IDwtIHN1bSh3YXRlcl8yMDA1JGNvbW1lcmNpYWxfYWNjb3VudHMpDQogIA0KY29tbWVyY2lhbF91c2FnZV8yMDA1IDwtIHN1bSh3YXRlcl8yMDA1JGFubnVhbF9jb21tZXJjaWFsX3VzYWdlKQ0KDQpjb21tZXJjaWFsX2FjY291bnRzXzIwMDYgPC0gc3VtKHdhdGVyXzIwMDYkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMDYgPC0gc3VtKHdhdGVyXzIwMDckYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQoNCmNvbW1lcmNpYWxfYWNjb3VudHNfMjAwNyA8LSBzdW0od2F0ZXJfMjAwNyRjb21tZXJjaWFsX2FjY291bnRzKQ0KICANCmNvbW1lcmNpYWxfdXNhZ2VfMjAwNyA8LSBzdW0od2F0ZXJfMjAwNyRhbm51YWxfY29tbWVyY2lhbF91c2FnZSkNCg0KY29tbWVyY2lhbF9hY2NvdW50c18yMDA4IDwtIHN1bSh3YXRlcl8yMDA4JGNvbW1lcmNpYWxfYWNjb3VudHMpDQogIA0KY29tbWVyY2lhbF91c2FnZV8yMDA4IDwtIHN1bSh3YXRlcl8yMDA4JGFubnVhbF9jb21tZXJjaWFsX3VzYWdlKQ0KDQpjb21tZXJjaWFsX2FjY291bnRzXzIwMDkgPC0gc3VtKHdhdGVyXzIwMDkkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMDkgPC0gc3VtKHdhdGVyXzIwMDkkYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQoNCmNvbW1lcmNpYWxfYWNjb3VudHNfMjAxMCA8LSBzdW0od2F0ZXJfMjAxMCRjb21tZXJjaWFsX2FjY291bnRzKQ0KICANCmNvbW1lcmNpYWxfdXNhZ2VfMjAxMCA8LSBzdW0od2F0ZXJfMjAxMCRhbm51YWxfY29tbWVyY2lhbF91c2FnZSkNCg0KY29tbWVyY2lhbF9hY2NvdW50c18yMDExIDwtIHN1bSh3YXRlcl8yMDExJGNvbW1lcmNpYWxfYWNjb3VudHMpDQogIA0KY29tbWVyY2lhbF91c2FnZV8yMDExIDwtIHN1bSh3YXRlcl8yMDExJGFubnVhbF9jb21tZXJjaWFsX3VzYWdlKQ0KDQpjb21tZXJjaWFsX2FjY291bnRzXzIwMTIgPC0gc3VtKHdhdGVyXzIwMTIkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMTIgPC0gc3VtKHdhdGVyXzIwMTIkYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQoNCmNvbW1lcmNpYWxfYWNjb3VudHNfMjAxMyA8LSBzdW0od2F0ZXJfMjAxMyRjb21tZXJjaWFsX2FjY291bnRzKQ0KICANCmNvbW1lcmNpYWxfdXNhZ2VfMjAxMyA8LSBzdW0od2F0ZXJfMjAxMyRhbm51YWxfY29tbWVyY2lhbF91c2FnZSkNCg0KY29tbWVyY2lhbF9hY2NvdW50c18yMDE0IDwtIHN1bSh3YXRlcl8yMDE0JGNvbW1lcmNpYWxfYWNjb3VudHMpDQogIA0KY29tbWVyY2lhbF91c2FnZV8yMDE0IDwtIHN1bSh3YXRlcl8yMDE0JGFubnVhbF9jb21tZXJjaWFsX3VzYWdlKQ0KDQpjb21tZXJjaWFsX2FjY291bnRzXzIwMTUgPC0gc3VtKHdhdGVyXzIwMTUkY29tbWVyY2lhbF9hY2NvdW50cykNCiAgDQpjb21tZXJjaWFsX3VzYWdlXzIwMTUgPC0gc3VtKHdhdGVyXzIwMTUkYW5udWFsX2NvbW1lcmNpYWxfdXNhZ2UpDQpgYGANCg0KYGBge3J9DQpjb21tZXJjaWFsX2FjY291bnRzIDwtIGMoY29tbWVyY2lhbF9hY2NvdW50c18yMDAwLCBjb21tZXJjaWFsX2FjY291bnRzXzIwMDEsIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAwMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJjaWFsX2FjY291bnRzXzIwMDMsIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAwNCwgY29tbWVyY2lhbF9hY2NvdW50c18yMDA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAwNiwgY29tbWVyY2lhbF9hY2NvdW50c18yMDA3LCBjb21tZXJjaWFsX2FjY291bnRzXzIwMDgsDQogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVyY2lhbF9hY2NvdW50c18yMDA5LCBjb21tZXJjaWFsX2FjY291bnRzXzIwMTAsIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAxMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJjaWFsX2FjY291bnRzXzIwMTIsIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAxMywgY29tbWVyY2lhbF9hY2NvdW50c18yMDE0LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcmNpYWxfYWNjb3VudHNfMjAxNSkNCg0KY29tbWVyY2lhbF91c2FnZSA8LSBjKGNvbW1lcmNpYWxfdXNhZ2VfMjAwMCwgY29tbWVyY2lhbF91c2FnZV8yMDAxLCBjb21tZXJjaWFsX3VzYWdlXzIwMDIsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVyY2lhbF91c2FnZV8yMDAzLCBjb21tZXJjaWFsX3VzYWdlXzIwMDQsIGNvbW1lcmNpYWxfdXNhZ2VfMjAwNSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZXJjaWFsX3VzYWdlXzIwMDYsIGNvbW1lcmNpYWxfdXNhZ2VfMjAwNywgY29tbWVyY2lhbF91c2FnZV8yMDA4LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcmNpYWxfdXNhZ2VfMjAwOSwgY29tbWVyY2lhbF91c2FnZV8yMDEwLCBjb21tZXJjaWFsX3VzYWdlXzIwMTEsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVyY2lhbF91c2FnZV8yMDEyLCBjb21tZXJjaWFsX3VzYWdlXzIwMTMsIGNvbW1lcmNpYWxfdXNhZ2VfMjAxNCwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZXJjaWFsX3VzYWdlXzIwMTUpDQpgYGANCg0KYGBge3J9DQphdmVyYWdlX2NvbW1lcmNpYWxfdXNhZ2UgPC0gY29tbWVyY2lhbF91c2FnZS9jb21tZXJjaWFsX2FjY291bnRzDQpgYGANCg0KYGBge3J9DQpjb21tZXJjaWFsX3VzYWdlLnRzIDwtIHRzKGNvbW1lcmNpYWxfdXNhZ2UsIHN0YXJ0PTIwMDAsIGZyZXF1ZW5jeT0xKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChjb21tZXJjaWFsX3VzYWdlLnRzLCBtYWluID0gIlRvdGFsIEFubnVhbCBDb21tZXJjaWFsIFVzYWdlLCBjdWJpYyBtZXRlcnMiKQ0KYGBgDQoNCmBgYHtyfQ0KYXZlcmFnZV9jb21tZXJjaWFsX3VzYWdlLnRzIDwtIHRzKGF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZSwgc3RhcnQ9MjAwMCwgZnJlcXVlbmN5PTEpDQpgYGANCg0KYGBge3J9DQpwbG90KGF2ZXJhZ2VfY29tbWVyY2lhbF91c2FnZS50cywgbWFpbiA9ICJBdmVyYWdlIEFubnVhbCBDb21tZXJjaWFsIFVzYWdlLCBjdWJpYyBtZXRlcnMiKQ0KYGBgDQoNCg0KIyBCaWVubmlhbCBEcmlua2luZyBXYXRlciBQbGFudHMgU3VydmV5IChES1dQKQ0KDQpbUG90YWJsZSB3YXRlciB1c2UgYnkgc2VjdG9yIGFuZCBhdmVyYWdlIGRhaWx5IHVzZV0oaHR0cHM6Ly93d3cxNTAuc3RhdGNhbi5nYy5jYS90MS90YmwxL2VuL2N2IXJlY3JlYXRlLmFjdGlvbj9waWQ9MzgxMDAyNzEwMSZzZWxlY3RlZE5vZGVJZHM9MUQ3JmNoZWNrZWRMZXZlbHM9MUQxLDFEMiZyZWZQZXJpb2RzPTIwMTEwMTAxLDIwMTcwMTAxJmRpbWVuc2lvbkxheW91dHM9bGF5b3V0MyxsYXlvdXQzLGxheW91dDImdmVjdG9yRGlzcGxheT1mYWxzZSkNCg0KVGFibGU6IDM4LTEwLTAyNzEtMDEgKGZvcm1lcmx5IENBTlNJTSAxNTMtMDEyNykNCg0KMzgxMDAyNzEwMV9kYXRhYmFzZUxvYWRpbmdEYXRhLmNzdg0KDQpgYGB7cn0NCkRLV1BfT250YXJpb191c2UgPC0gZnJlYWQoIjM4MTAwMjcxMDFfZGF0YWJhc2VMb2FkaW5nRGF0YS5jc3YiKQ0KDQpzdHIoREtXUF9PbnRhcmlvX3VzZSkNCmBgYA0KDQpgYGB7cn0NCnVuaXF1ZShES1dQX09udGFyaW9fdXNlJGBDaGFyYWN0ZXJpc3RpY3Mgb2YgcG90YWJsZSB3YXRlciB1c2VgKQ0KYGBgDQoNCmBgYHtyfQ0KREtXUF9PbnRhcmlvX2F2ZXJhZ2VfZGFpbHlfcGVyX2NhcGl0YSA8LSBES1dQX09udGFyaW9fdXNlW2BDaGFyYWN0ZXJpc3RpY3Mgb2YgcG90YWJsZSB3YXRlciB1c2VgPT0iQXZlcmFnZSBkYWlseSB0b3RhbCB1c2UgcGVyIGNhcGl0YSBvZiB0aGUgcG9wdWxhdGlvbiBzZXJ2ZWQiLCAuKFllYXIgPSBSRUZfREFURSwgQXZlcmFnZV9kYWlseV9wZXJfY2FwaXRhX2xpdGVycyA9IFZBTFVFKV0NCg0KREtXUF9PbnRhcmlvX2F2ZXJhZ2VfcmVzaWRlbnRpYWwgPC0gREtXUF9PbnRhcmlvX3VzZVtgQ2hhcmFjdGVyaXN0aWNzIG9mIHBvdGFibGUgd2F0ZXIgdXNlYD09IkF2ZXJhZ2UgZGFpbHkgcmVzaWRlbnRpYWwgdXNlIHBlciBjYXBpdGEgb2YgdGhlIHBvcHVsYXRpb24gc2VydmVkIiwgLihZZWFyID0gUkVGX0RBVEUsIEF2ZXJhZ2VfZGFpbHlfcmVzaWRlbnRpYWxfbGl0ZXJzID0gVkFMVUUpXQ0KYGBgDQoNCmBgYHtyfQ0KREtXUF9PbnRhcmlvX2F2ZXJhZ2VfZGFpbHlfcGVyX2NhcGl0YQ0KYGBgDQoNCmBgYHtyfQ0KREtXUF9PbnRhcmlvX2F2ZXJhZ2VfcmVzaWRlbnRpYWwNCmBgYA0KDQpbUG90YWJsZSB3YXRlciB2b2x1bWVzIHByb2Nlc3NlZCBieSBkcmlua2luZyB3YXRlciBwbGFudHMsIGJ5IG1vbnRoICh4IDEsMDAwLDAwMCldKGh0dHBzOi8vd3d3MTUwLnN0YXRjYW4uZ2MuY2EvdDEvdGJsMS9lbi9jdiFyZWNyZWF0ZS5hY3Rpb24/cGlkPTM4MTAwMjcyMDEmc2VsZWN0ZWROb2RlSWRzPTFENyZjaGVja2VkTGV2ZWxzPTFEMiZyZWZQZXJpb2RzPTIwMDUwMTAxLDIwMTcwMTAxJmRpbWVuc2lvbkxheW91dHM9bGF5b3V0MyxsYXlvdXQzLGxheW91dDImdmVjdG9yRGlzcGxheT1mYWxzZSkNCg0KVGFibGU6IDM4LTEwLTAyNzItMDEgKGZvcm1lcmx5IENBTlNJTSAxNTMtMDEyNCkNCg0KMzgxMDAyNzIwMV9kYXRhYmFzZUxvYWRpbmdEYXRhLmNzdg0KDQpgYGB7cn0NCkRLV1BfT250YXJpb19wcm9jZXNzZWQgPC0gZnJlYWQoIjM4MTAwMjcyMDFfZGF0YWJhc2VMb2FkaW5nRGF0YS5jc3YiKQ0KYGBgDQoNClZBTFVFID0gbWlsbGlvbnMgY3ViaWMgbWV0ZXJzDQoNCmBgYHtyfQ0Kc3RyKERLV1BfT250YXJpb19wcm9jZXNzZWQpDQpgYGANCg0KYGBge3J9DQpES1dQX09udGFyaW9fcHJvY2Vzc2VkJE1vbnRoIDwtIG1hdGNoKERLV1BfT250YXJpb19wcm9jZXNzZWQkTW9udGgsIG1vbnRoLm5hbWUpDQoNCnN0cihES1dQX09udGFyaW9fcHJvY2Vzc2VkKQ0KYGBgDQoNCmBgYHtyfQ0KREtXUF9PbnRhcmlvX3Byb2Nlc3NlZF92b2x1bWVzIDwtIERLV1BfT250YXJpb19wcm9jZXNzZWRbLC4oVm9sdW1lID0gVkFMVUUpLCBieSA9IC4oWWVhciA9IFJFRl9EQVRFLCBNb250aCldDQoNCkRLV1BfT250YXJpb19wcm9jZXNzZWRfdm9sdW1lcyA8LSBES1dQX09udGFyaW9fcHJvY2Vzc2VkX3ZvbHVtZXNbb3JkZXIoWWVhcixNb250aCldDQoNCnN0cihES1dQX09udGFyaW9fcHJvY2Vzc2VkX3ZvbHVtZXMpDQpgYGANCg0KYGBge3J9DQpES1dQX09udGFyaW9fcHJvY2Vzc2VkX3ZvbHVtZXMudHMgPC0gdHMoREtXUF9PbnRhcmlvX3Byb2Nlc3NlZF92b2x1bWVzJFZvbHVtZSwgc3RhcnQgPSAyMDA1LCBmcmVxdWVuY3kgPSAxMikNCmBgYA0KDQpgYGB7cn0NCkRLV1BfT250YXJpb19wcm9jZXNzZWRfdm9sdW1lcy50cy5jb21wb25lbnRzIDwtIGRlY29tcG9zZShES1dQX09udGFyaW9fcHJvY2Vzc2VkX3ZvbHVtZXMudHMpDQoNCmF1dG9wbG90KERLV1BfT250YXJpb19wcm9jZXNzZWRfdm9sdW1lcy50cy5jb21wb25lbnRzKQ0KYGBgDQoNCltXYXN0ZXdhdGVyIHZvbHVtZXMgcHJvY2Vzc2VkIGJ5IG11bmljaXBhbCBzZXdhZ2Ugc3lzdGVtcyAoeCAxLDAwMCwwMDApXShodHRwczovL3d3dzE1MC5zdGF0Y2FuLmdjLmNhL3QxL3RibDEvZW4vY3YhcmVjcmVhdGUuYWN0aW9uP3BpZD0zODEwMDA5OTAxJnNlbGVjdGVkTm9kZUlkcz0xRDcsMkQyLDJEMywyRDQsMkQ1LDJENiwyRDcsMkQ4LDJEOSwyRDEwLDJEMTEsMkQxMiwyRDEzJmNoZWNrZWRMZXZlbHM9JnJlZlBlcmlvZHM9MjAxMzAxMDEsMjAxNzAxMDEmZGltZW5zaW9uTGF5b3V0cz1sYXlvdXQzLGxheW91dDMsbGF5b3V0MiZ2ZWN0b3JEaXNwbGF5PWZhbHNlKQ0KDQpUYWJsZTogMzgtMTAtMDA5OS0wMQ0KDQozODEwMDA5OTAxX2RhdGFiYXNlTG9hZGluZ0RhdGEuY3N2DQoNClZBTFVFID0gbWlsbGlvbnMgY3ViaWMgbWV0ZXJzDQoNCmBgYHtyfQ0KREtXUF9PbnRhcmlvX3dhc3Rld2F0ZXIgPC0gZnJlYWQoIjM4MTAwMDk5MDFfZGF0YWJhc2VMb2FkaW5nRGF0YS5jc3YiKQ0KDQpzdHIoREtXUF9PbnRhcmlvX3dhc3Rld2F0ZXIpDQpgYGANCg0KYGBge3J9DQpES1dQX09udGFyaW9fd2FzdGV3YXRlciRNb250aCA8LSBtYXRjaChES1dQX09udGFyaW9fd2FzdGV3YXRlciRNb250aCwgbW9udGgubmFtZSkNCg0KREtXUF9PbnRhcmlvX3dhc3Rld2F0ZXJfdm9sdW1lcyA8LSBES1dQX09udGFyaW9fd2FzdGV3YXRlclssLihWb2x1bWUgPSBWQUxVRSksIGJ5ID0gLihZZWFyID0gUkVGX0RBVEUsIE1vbnRoKV0NCg0KREtXUF9PbnRhcmlvX3dhc3Rld2F0ZXJfdm9sdW1lcyA8LSBES1dQX09udGFyaW9fd2FzdGV3YXRlcl92b2x1bWVzW29yZGVyKFllYXIsTW9udGgpXQ0KDQpES1dQX09udGFyaW9fd2FzdGV3YXRlcl92b2x1bWVzLnRzIDwtIHRzKERLV1BfT250YXJpb193YXN0ZXdhdGVyX3ZvbHVtZXMkVm9sdW1lLCBzdGFydCA9IDIwMTMsIGZyZXF1ZW5jeSA9IDEyKQ0KDQpES1dQX09udGFyaW9fd2FzdGV3YXRlcl92b2x1bWVzLnRzLmNvbXBvbmVudHMgPC0gZGVjb21wb3NlKERLV1BfT250YXJpb193YXN0ZXdhdGVyX3ZvbHVtZXMudHMpDQoNCmF1dG9wbG90KERLV1BfT250YXJpb193YXN0ZXdhdGVyX3ZvbHVtZXMudHMuY29tcG9uZW50cykNCmBgYA0KDQojIEZ1cnRoZXIgcmVzb3VyY2VzDQoNCiMjIE9udGFyaW8gTXVuaWNpcGFsIFdhc3Rld2F0ZXINCg0KW011bmljaXBhbCB0cmVhdGVkIHdhc3Rld2F0ZXIgZWZmbHVlbnRdKGh0dHBzOi8vd3d3Lm9udGFyaW8uY2EvZGF0YS9tdW5pY2lwYWwtdHJlYXRlZC13YXN0ZXdhdGVyLWVmZmx1ZW50KQ0KDQo+IERhdGEgY29udGFpbnMgZmxvd3MgYW5kIGVmZmx1ZW50IHF1YWxpdHkgZnJvbSBvdXIgbXVuaWNpcGFsIHdhc3Rld2F0ZXIgdHJlYXRtZW50IHBsYW50cy4NCg0KTVdEMjAwOC54bHN4IC0gTVdEMjAxNi54bHN4DQoNCiMjIENpdHkgb2YgVG9yb250bywgMjAxOQ0KDQpbV2F0ZXIgQ29uc3VtcHRpb24gUmVwb3J0XShodHRwczovL3d3dy50b3JvbnRvLmNhL3NlcnZpY2VzLXBheW1lbnRzL3dhdGVyLWVudmlyb25tZW50L3RhcC13YXRlci1pbi10b3JvbnRvL2RhaWx5LXdhdGVyLWNvbnN1bXB0aW9uLXJlcG9ydC8pDQoNCiMjIE1QTVAgTXVsdGktWWVhciBSZXBvcnQNCg0KW01QTVAgTXVsdGktWWVhciBSZXBvcnQgLSBCeSBNdW5pY2lwYWxpdHldKGh0dHBzOi8vZWZpcy5mbWEuY3NjLmdvdi5vbi5jYS9maXIvTVBNUCUyME11bHRpJTIwWWVhci5odG0pDQoNClRvcm9udG8gQyAyNi1KYW4tMTc6IE1QTVAtTVVMVEktWVItVG9yb250byBDLnhscw0KDQplLmcuDQoNCj4gU0xDIDkxIDMxMTIgNDUJYikJVG90YWwgY29zdHMgZm9yIHRoZSB0cmVhdG1lbnQgYW5kIGRpc3Bvc2FsIG9mIHdhc3Rld2F0ZXIgcGVyIG1lZ2FsaXRyZS4NCg0KPiBTTEMgOTEgMzMxMSAgNDUJYikJVG90YWwgY29zdHMgZm9yIHRoZSB0cmVhdG1lbnQgb2YgZHJpbmtpbmcgd2F0ZXIgcGVyIG1lZ2FsaXRyZS4NCg0KIyMgU3RhdGlzdGljcyBDYW5hZGENCg0KWzIwMTEgTXVuaWNpcGFsIFdhdGVyIFVzZSBSZXBvcnQg4oCTIE11bmljaXBhbCBXYXRlciBVc2UgMjAwOSBTdGF0aXN0aWNzXShodHRwOi8vd3d3LmVjLmdjLmNhL2RvYy9wdWJsaWNhdGlvbnMvZWF1LXdhdGVyL2NvbTE0NTQvaW5kZXgtZW5nLmh0bSksIFRhYmxlIDI6IFRvdGFsIGFuZCBSZXNpZGVudGlhbCBwZXIgQ2FwaXRhIFdhdGVyIFVzZSwgYnkgUHJvdmluY2UvVGVycml0b3J5IGFuZCBNdW5pY2lwYWwgUG9wdWxhdGlvbg==