#include <bits/stdc++.h>
using namespace std;
int main() {
/*
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
rend(v) begin(v) rbegin(v) end(v)
. . . .
| | | |
V V V V
+--------------------------------------------------------------------------------+
| start | 1 | 3 | . . . . key . . . . | 12 | finish |
+--------------------------------------------------------------------------------+
Declaring forward iterator : vector<int>::iterator itr;
Declaring reverse iterator : vector<int>::reverse_iterator itr;
*/
/*
* lower_bound(key) :
*
* Works only on "sorted" vector or set
*
* On ascending sorted vector,
* *lower_bound(begin(v), end(v), key) returns First Element >= key
*
* On descending sorted vector,
* *lower_bound(begin(v), end(v), key, greater<int>()) returns First Element <= key
*/
/*
* upper_bound(key) : First element strictly greater than key
*
* Works only on "sorted" vector or set.
*
* On ascending sorted vector,
* *upper_bound(begin(v), end(v), key) returns First Element > key
*
* On descending sorted vector,
* *upper_bound(begin(v), end(v), key, greater<int>()) returns First Element < key
*
*/
/// FOR ASCENDING SORTED ARRAY
/////////////////////////////////////////////////////////////////////////////////////
/* LAST ELEMENT STRICTLY SMALLER THAN THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 1;
auto it = upper_bound(rbegin(v), rend(v), key, greater<int>());
if(it == rend(v)){
cout << "No Such Element!!\n";
}else{
cout << "Last Element Strictly Smaller than key : " << *it << "\n";
}
/* COUNT OF ELEMENTS STRICTLY SMALLER THAN THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 7;
int cnt = lower_bound(begin(v), end(v), key) - v.begin();
cout << "Count of Elements Strictly Smaller than key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* FIRST ELEMENT STRICTLY GREATER THAN THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 12;
auto it = upper_bound(begin(v), end(v), key);
if(it == end(v)){
cout << "No Element!!\n";
}else{
cout << "First Element Strictly Greater than key : " << *it << "\n";
}
/* COUNT OF ELEMENTS STRICTLY GREATER THAN THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 6;
int cnt = end(v) - upper_bound(begin(v), end(v), key);
cout << "Count of Elements Strictly Greater than key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* LAST ELEMENT SMALLER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 15;
auto it = lower_bound(rbegin(v), rend(v), key, greater<int>());
if(it == rend(v)){
cout << "No Element!!\n";
}else{
cout << "Last Element Smaller than or equal to key : " << *it << "\n";
}
/* COUNT OF ELEMENTS SMALLER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 12;
int cnt = upper_bound(begin(v), end(v), key) - begin(v);
cout << "Count of Elements Smaller than or equal to key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* FIRST ELEMENT GREATER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 11;
auto it = lower_bound(begin(v), end(v), key);
if(it == end(v)){
cout << "No Element!!\n";
}else{
cout << "First Element Greater than or equal to key : " << *it << "\n";
}
/* COUNT OF ELEMENTS GREATER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {1, 3, 5, 7, 7, 8, 9, 9, 10, 12};
int key = 6;
int cnt = end(v) - lower_bound(begin(v), end(v), key);
cout << "Count of Elements Greater than or equal to key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/// FOR DESCENDING SORTED ARRAY
/////////////////////////////////////////////////////////////////////////////////////
/* FIRST ELEMENT STRICTLY SMALLER THAN THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 11;
auto it = upper_bound(begin(v), end(v), key, greater<int>());
if(it == end(v)){
cout << "No Such Element!!\n";
}else{
cout << "First Element Strictly Smaller than key : " << *it << "\n";
}
/* COUNT OF ELEMENTS STRICTLY SMALLER THAN THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 12;
int cnt = end(v) - upper_bound(begin(v), end(v), key, greater<int>());
cout << "Count of Elements Strictly Smaller than key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* LAST ELEMENT STRICTLY GREATER THAN THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = -25;
auto it = upper_bound(rbegin(v), rend(v), key);
if(it == rend(v)){
cout << "No Element!!\n";
}else{
cout << "Last Element Strictly Greater than key : " << *it << "\n";
}
/* COUNT OF ELEMENTS STRICTLY GREATER THAN THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 1;
int cnt = rend(v) - upper_bound(rbegin(v), rend(v), key);
cout << "Count of Elements Strictly Greater than key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* FIRST ELEMENT SMALLER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 9;
auto it = lower_bound(begin(v), end(v), key, greater<int>());
if(it == end(v)){
cout << "No Element!!\n";
}else{
cout << "First Element Smaller than or equal to key : " << *it << "\n";
}
/* COUNT OF ELEMENTS SMALLER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 9;
int cnt = end(v) - lower_bound(begin(v), end(v), key, greater<int>());
cout << "Count of Elements Smaller than or equal to key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
/* LAST ELEMENT GREATER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 13;
auto it = lower_bound(rbegin(v), rend(v), key);
if(it == rend(v)){
cout << "No Element!!\n";
}else{
cout << "Last Element Greater than or equal to key : " << *it << "\n";
}
/* COUNT OF ELEMENTS GREATER THAN OR EQUAL TO THE KEY VALUE */
vector<int> v = {12, 10, 9, 9, 8, 7, 7, 5, 3, 1};
int key = 1;
int cnt = rend(v) - lower_bound(rbegin(v), rend(v), key);
cout << "Count of Elements Greater than or equal to key : " << cnt << "\n";
/////////////////////////////////////////////////////////////////////////////////////
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCQoJCi8qCgkJCQkJdmVjdG9yPGludD4gdiA9IHsxLCAzLCA1LCA3LCA3LCA4LCA5LCA5LCAxMCwgMTJ9OwoJCQkJCQkKCglyZW5kKHYpCSAgYmVnaW4odikJCQkJCQkJCQkJCQlyYmVnaW4odikgIGVuZCh2KQoJCS4JCS4JCQkJCQkJCQkJCQkJCS4JCS4KCQl8CQl8CQkJCQkJCQkJCQkJCQl8CQl8CgkJVgkJVgkJCQkJCQkJCQkJCQkJVgkJVgoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJfCBzdGFydCB8CTEJfAkzCXwJLgkuCS4JLiAga2V5CS4JLgkuCS4JfAkxMgl8IGZpbmlzaCB8CgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkKCURlY2xhcmluZyBmb3J3YXJkIGl0ZXJhdG9yIDogdmVjdG9yPGludD46Oml0ZXJhdG9yIGl0cjsKCURlY2xhcmluZyByZXZlcnNlIGl0ZXJhdG9yIDogdmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgaXRyOwoJCQoqLwkJCgkKCS8qCgkgKiBsb3dlcl9ib3VuZChrZXkpIDogCgkgKiAKCSAqICBXb3JrcyBvbmx5IG9uICJzb3J0ZWQiIHZlY3RvciBvciBzZXQKCSAqCgkgKglPbiBhc2NlbmRpbmcgc29ydGVkIHZlY3RvciwKCSAqCSpsb3dlcl9ib3VuZChiZWdpbih2KSwgZW5kKHYpLCBrZXkpCXJldHVybnMgRmlyc3QgRWxlbWVudCA+PSBrZXkJCgkgKgoJICogIE9uIGRlc2NlbmRpbmcgc29ydGVkIHZlY3RvciwKCSAqCSpsb3dlcl9ib3VuZChiZWdpbih2KSwgZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKQlyZXR1cm5zIEZpcnN0IEVsZW1lbnQgPD0ga2V5CgkgKi8KCQoJLyoKCSAqIHVwcGVyX2JvdW5kKGtleSkJOiBGaXJzdCBlbGVtZW50IHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBrZXkgCgkgKiAKCSAqICBXb3JrcyBvbmx5IG9uICJzb3J0ZWQiIHZlY3RvciBvciBzZXQuCgkgKiAKCSAqCU9uIGFzY2VuZGluZyBzb3J0ZWQgdmVjdG9yLAoJICoJKnVwcGVyX2JvdW5kKGJlZ2luKHYpLCBlbmQodiksIGtleSkJcmV0dXJucyBGaXJzdCBFbGVtZW50ID4ga2V5CQoJICoKCSAqICBPbiBkZXNjZW5kaW5nIHNvcnRlZCB2ZWN0b3IsCgkgKgkqdXBwZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5LCBncmVhdGVyPGludD4oKSkJcmV0dXJucwlGaXJzdCBFbGVtZW50IDwga2V5CgkgKgoJICovCgkKCQovLy8gRk9SIEFTQ0VORElORyBTT1JURUQgQVJSQVkKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCS8qCQlMQVNUIEVMRU1FTlQgU1RSSUNUTFkgU01BTExFUiBUSEFOIFRIRSBLRVkgVkFMVUUJCSovCgoJdmVjdG9yPGludD4gdiA9IHsxLCAzLCA1LCA3LCA3LCA4LCA5LCA5LCAxMCwgMTJ9OwoJaW50IGtleSA9IDE7CglhdXRvIGl0ID0gdXBwZXJfYm91bmQocmJlZ2luKHYpLCByZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKTsKCWlmKGl0ID09IHJlbmQodikpewoJCWNvdXQgPDwgIk5vIFN1Y2ggRWxlbWVudCEhXG4iOwoJfWVsc2V7CgkJY291dCA8PCAiTGFzdCBFbGVtZW50IFN0cmljdGx5IFNtYWxsZXIgdGhhbiBrZXkgOiAiIDw8ICppdCA8PCAiXG4iOwoJfQoJCgkvKgkJQ09VTlQgT0YgRUxFTUVOVFMgU1RSSUNUTFkgU01BTExFUiBUSEFOIFRIRSBLRVkgVkFMVUUJKi8KCQoJdmVjdG9yPGludD4gdiA9IHsxLCAzLCA1LCA3LCA3LCA4LCA5LCA5LCAxMCwgMTJ9OwoJaW50IGtleSA9IDc7CglpbnQgY250ID0gbG93ZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5KSAtIHYuYmVnaW4oKTsKCWNvdXQgPDwgIkNvdW50IG9mIEVsZW1lbnRzIFN0cmljdGx5IFNtYWxsZXIgdGhhbiBrZXkgOiAiIDw8IGNudCA8PCAiXG4iOwoJCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkvKgkJRklSU1QgRUxFTUVOVCBTVFJJQ1RMWSBHUkVBVEVSIFRIQU4gVEhFIEtFWSBWQUxVRQkJKi8KCgl2ZWN0b3I8aW50PiB2ID0gezEsIDMsIDUsIDcsIDcsIDgsIDksIDksIDEwLCAxMn07CglpbnQga2V5ID0gMTI7CglhdXRvIGl0ID0gdXBwZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5KTsKCWlmKGl0ID09IGVuZCh2KSl7CgkJY291dCA8PCAiTm8gRWxlbWVudCEhXG4iOwoJfWVsc2V7CgkJY291dCA8PCAiRmlyc3QgRWxlbWVudCBTdHJpY3RseSBHcmVhdGVyIHRoYW4ga2V5IDogIiA8PCAqaXQgPDwgIlxuIjsKCX0KCQoJLyoJCUNPVU5UIE9GIEVMRU1FTlRTIFNUUklDVExZIEdSRUFURVIgVEhBTiBUSEUgS0VZIFZBTFVFCSovCgkKCXZlY3RvcjxpbnQ+IHYgPSB7MSwgMywgNSwgNywgNywgOCwgOSwgOSwgMTAsIDEyfTsKCWludCBrZXkgPSA2OwoJaW50IGNudCA9IGVuZCh2KSAtIHVwcGVyX2JvdW5kKGJlZ2luKHYpLCBlbmQodiksIGtleSk7Cgljb3V0IDw8ICJDb3VudCBvZiBFbGVtZW50cyBTdHJpY3RseSBHcmVhdGVyIHRoYW4ga2V5IDogIiA8PCBjbnQgPDwgIlxuIjsKCgkKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCgkvKgkJTEFTVCBFTEVNRU5UIFNNQUxMRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgS0VZIFZBTFVFCQkqLwoJCgl2ZWN0b3I8aW50PiB2ID0gezEsIDMsIDUsIDcsIDcsIDgsIDksIDksIDEwLCAxMn07CglpbnQga2V5ID0gMTU7CglhdXRvIGl0ID0gbG93ZXJfYm91bmQocmJlZ2luKHYpLCByZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKTsKCWlmKGl0ID09IHJlbmQodikpewoJCWNvdXQgPDwgIk5vIEVsZW1lbnQhIVxuIjsKCX1lbHNlewoJCWNvdXQgPDwgIkxhc3QgRWxlbWVudCBTbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8ga2V5IDogIiA8PCAqaXQgPDwgIlxuIjsKCX0KCQoJLyoJCUNPVU5UIE9GIEVMRU1FTlRTIFNNQUxMRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgS0VZIFZBTFVFCQkqLwoJCgl2ZWN0b3I8aW50PiB2ID0gezEsIDMsIDUsIDcsIDcsIDgsIDksIDksIDEwLCAxMn07CglpbnQga2V5ID0gMTI7CglpbnQgY250ID0gdXBwZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5KSAtIGJlZ2luKHYpOwoJY291dCA8PCAiQ291bnQgb2YgRWxlbWVudHMgU21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGtleSA6ICIgPDwgY250IDw8ICJcbiI7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJLyoJCUZJUlNUIEVMRU1FTlQgR1JFQVRFUiBUSEFOIE9SIEVRVUFMIFRPIFRIRSBLRVkgVkFMVUUJCSovCgoJdmVjdG9yPGludD4gdiA9IHsxLCAzLCA1LCA3LCA3LCA4LCA5LCA5LCAxMCwgMTJ9OwoJaW50IGtleSA9IDExOwoJYXV0byBpdCA9IGxvd2VyX2JvdW5kKGJlZ2luKHYpLCBlbmQodiksIGtleSk7CglpZihpdCA9PSBlbmQodikpewoJCWNvdXQgPDwgIk5vIEVsZW1lbnQhIVxuIjsKCX1lbHNlewoJCWNvdXQgPDwgIkZpcnN0IEVsZW1lbnQgR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGtleSA6ICIgPDwgKml0IDw8ICJcbiI7Cgl9CgkKCS8qCQlDT1VOVCBPRiBFTEVNRU5UUyBHUkVBVEVSIFRIQU4gT1IgRVFVQUwgVE8gVEhFIEtFWSBWQUxVRQkJKi8KCQoJdmVjdG9yPGludD4gdiA9IHsxLCAzLCA1LCA3LCA3LCA4LCA5LCA5LCAxMCwgMTJ9OwoJaW50IGtleSA9IDY7CglpbnQgY250ID0gZW5kKHYpIC0gbG93ZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5KTsKCWNvdXQgPDwgIkNvdW50IG9mIEVsZW1lbnRzIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBrZXkgOiAiIDw8IGNudCA8PCAiXG4iOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCi8vLyBGT1IgREVTQ0VORElORyBTT1JURUQgQVJSQVkKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCgkvKgkJRklSU1QgRUxFTUVOVCBTVFJJQ1RMWSBTTUFMTEVSIFRIQU4gVEhFIEtFWSBWQUxVRQkJKi8KCgl2ZWN0b3I8aW50PiB2ID0gezEyLCAxMCwgOSwgOSwgOCwgNywgNywgNSwgMywgMX07CglpbnQga2V5ID0gMTE7CglhdXRvIGl0ID0gdXBwZXJfYm91bmQoYmVnaW4odiksIGVuZCh2KSwga2V5LCBncmVhdGVyPGludD4oKSk7CglpZihpdCA9PSBlbmQodikpewoJCWNvdXQgPDwgIk5vIFN1Y2ggRWxlbWVudCEhXG4iOwoJfWVsc2V7CgkJY291dCA8PCAiRmlyc3QgRWxlbWVudCBTdHJpY3RseSBTbWFsbGVyIHRoYW4ga2V5IDogIiA8PCAqaXQgPDwgIlxuIjsKCX0KCQoJLyoJCUNPVU5UIE9GIEVMRU1FTlRTIFNUUklDVExZIFNNQUxMRVIgVEhBTiBUSEUgS0VZIFZBTFVFCSovCgkKCXZlY3RvcjxpbnQ+IHYgPSB7MTIsIDEwLCA5LCA5LCA4LCA3LCA3LCA1LCAzLCAxfTsKCWludCBrZXkgPSAxMjsKCWludCBjbnQgPSBlbmQodikgLSB1cHBlcl9ib3VuZChiZWdpbih2KSwgZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKTsKCWNvdXQgPDwgIkNvdW50IG9mIEVsZW1lbnRzIFN0cmljdGx5IFNtYWxsZXIgdGhhbiBrZXkgOiAiIDw8IGNudCA8PCAiXG4iOwoJCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkvKgkJTEFTVCBFTEVNRU5UIFNUUklDVExZIEdSRUFURVIgVEhBTiBUSEUgS0VZIFZBTFVFCQkqLwoKCXZlY3RvcjxpbnQ+IHYgPSB7MTIsIDEwLCA5LCA5LCA4LCA3LCA3LCA1LCAzLCAxfTsKCWludCBrZXkgPSAtMjU7CglhdXRvIGl0ID0gdXBwZXJfYm91bmQocmJlZ2luKHYpLCByZW5kKHYpLCBrZXkpOwoJaWYoaXQgPT0gcmVuZCh2KSl7CgkJY291dCA8PCAiTm8gRWxlbWVudCEhXG4iOwoJfWVsc2V7CgkJY291dCA8PCAiTGFzdCBFbGVtZW50IFN0cmljdGx5IEdyZWF0ZXIgdGhhbiBrZXkgOiAiIDw8ICppdCA8PCAiXG4iOwoJfQoJCgkvKgkJQ09VTlQgT0YgRUxFTUVOVFMgU1RSSUNUTFkgR1JFQVRFUiBUSEFOIFRIRSBLRVkgVkFMVUUJKi8KCQoJdmVjdG9yPGludD4gdiA9IHsxMiwgMTAsIDksIDksIDgsIDcsIDcsIDUsIDMsIDF9OwoJaW50IGtleSA9IDE7CglpbnQgY250ID0gcmVuZCh2KSAtIHVwcGVyX2JvdW5kKHJiZWdpbih2KSwgcmVuZCh2KSwga2V5KTsKCWNvdXQgPDwgIkNvdW50IG9mIEVsZW1lbnRzIFN0cmljdGx5IEdyZWF0ZXIgdGhhbiBrZXkgOiAiIDw8IGNudCA8PCAiXG4iOwoKCQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkKCS8qCQlGSVJTVCBFTEVNRU5UIFNNQUxMRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgS0VZIFZBTFVFCQkqLwoJCgl2ZWN0b3I8aW50PiB2ID0gezEyLCAxMCwgOSwgOSwgOCwgNywgNywgNSwgMywgMX07CglpbnQga2V5ID0gOTsKCWF1dG8gaXQgPSBsb3dlcl9ib3VuZChiZWdpbih2KSwgZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKTsKCWlmKGl0ID09IGVuZCh2KSl7CgkJY291dCA8PCAiTm8gRWxlbWVudCEhXG4iOwoJfWVsc2V7CgkJY291dCA8PCAiRmlyc3QgRWxlbWVudCBTbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8ga2V5IDogIiA8PCAqaXQgPDwgIlxuIjsKCX0KCQoJLyoJCUNPVU5UIE9GIEVMRU1FTlRTIFNNQUxMRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgS0VZIFZBTFVFCQkqLwoJCgl2ZWN0b3I8aW50PiB2ID0gezEyLCAxMCwgOSwgOSwgOCwgNywgNywgNSwgMywgMX07CglpbnQga2V5ID0gOTsKCWludCBjbnQgPSBlbmQodikgLSBsb3dlcl9ib3VuZChiZWdpbih2KSwgZW5kKHYpLCBrZXksIGdyZWF0ZXI8aW50PigpKTsKCWNvdXQgPDwgIkNvdW50IG9mIEVsZW1lbnRzIFNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBrZXkgOiAiIDw8IGNudCA8PCAiXG4iOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCS8qCQlMQVNUIEVMRU1FTlQgR1JFQVRFUiBUSEFOIE9SIEVRVUFMIFRPIFRIRSBLRVkgVkFMVUUJCSovCgoJdmVjdG9yPGludD4gdiA9IHsxMiwgMTAsIDksIDksIDgsIDcsIDcsIDUsIDMsIDF9OwoJaW50IGtleSA9IDEzOwoJYXV0byBpdCA9IGxvd2VyX2JvdW5kKHJiZWdpbih2KSwgcmVuZCh2KSwga2V5KTsKCWlmKGl0ID09IHJlbmQodikpewoJCWNvdXQgPDwgIk5vIEVsZW1lbnQhIVxuIjsKCX1lbHNlewoJCWNvdXQgPDwgIkxhc3QgRWxlbWVudCBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ga2V5IDogIiA8PCAqaXQgPDwgIlxuIjsKCX0KCQoJLyoJCUNPVU5UIE9GIEVMRU1FTlRTIEdSRUFURVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgS0VZIFZBTFVFCQkqLwoJCgl2ZWN0b3I8aW50PiB2ID0gezEyLCAxMCwgOSwgOSwgOCwgNywgNywgNSwgMywgMX07CglpbnQga2V5ID0gMTsKCWludCBjbnQgPSByZW5kKHYpIC0gbG93ZXJfYm91bmQocmJlZ2luKHYpLCByZW5kKHYpLCBrZXkpOwoJY291dCA8PCAiQ291bnQgb2YgRWxlbWVudHMgR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGtleSA6ICIgPDwgY250IDw8ICJcbiI7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJcmV0dXJuIDA7Cn0=