RE: [RFC PATCH 1/2] clk: add new APIs to operate on all available clocks
From: "A.s. Dong" <aisheng.dong@nxp.com>
Date: 2018-03-20 03:21:27
Also in:
linux-arm-kernel, linux-clk, lkml
PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBTdGVwaGVuIEJveWQgW21haWx0 bzpzYm95ZEBrZXJuZWwub3JnXQ0KPiBTZW50OiBUdWVzZGF5LCBNYXJjaCAyMCwgMjAxOCAxMjoy MiBBTQ0KPiBUbzogQS5zLiBEb25nIDxhaXNoZW5nLmRvbmdAbnhwLmNvbT47IGxpbnV4LWNsa0B2 Z2VyLmtlcm5lbC5vcmcNCj4gQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsgZGwtDQo+IGxpbnV4LWlteCA8bGludXgt aW14QG54cC5jb20+OyBhaXNoZW5nLmRvbmdAY29kZWF1cm9yYS5vcmc7IGxpbnV4LQ0KPiBmYmRl dkB2Z2VyLmtlcm5lbC5vcmc7IHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tOw0KPiBzYm95 ZEBjb2RlYXVyb3JhLm9yZzsgaGRlZ29lZGVAcmVkaGF0LmNvbTsNCj4gYi56b2xuaWVya2llQHNh bXN1bmcuY29tOyBBLnMuIERvbmcgPGFpc2hlbmcuZG9uZ0BueHAuY29tPg0KPiBTdWJqZWN0OiBS ZTogW1JGQyBQQVRDSCAxLzJdIGNsazogYWRkIG5ldyBBUElzIHRvIG9wZXJhdGUgb24gYWxsIGF2 YWlsYWJsZQ0KPiBjbG9ja3MNCj4gDQo+IFF1b3RpbmcgRG9uZyBBaXNoZW5nICgyMDE4LTAxLTIz IDA0OjUwOjQwKQ0KPiA+IFRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvZl9jbGtfYnVsa19nZXRfYWxs IGFuZCBjbGtfYnVsa194X2FsbCBBUElzIHRvDQo+ID4gdXNlcnMgd2hvIGp1c3Qgd2FudCB0byBo YW5kbGUgYWxsIGF2YWlsYWJsZSBjbG9ja3MgZnJvbSBkZXZpY2UgdHJlZQ0KPiA+IHdpdGhvdXQg bmVlZCB0byBrbm93IHRoZSBkZXRhaWxlZCBjbG9jayBpbmZvcm1hdGlvbiBsaWtlcyBjbG9jaw0K PiA+IG51bWJlcnMgYW5kIG5hbWVzLiBUaGlzIGlzIHVzZWZ1bCBpbiB3cml0aW5nIHNvbWUgZ2Vu ZXJpYyBkcml2ZXJzIHRvDQo+ID4gaGFuZGxlIGNsb2NrIHBhcnQuDQo+ID4NCj4gPiBDYzogU3Rl cGhlbiBCb3lkIDxzYm95ZEBjb2RlYXVyb3JhLm9yZz4NCj4gPiBDYzogTWFzYWhpcm8gWWFtYWRh IDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEb25n IEFpc2hlbmcgPGFpc2hlbmcuZG9uZ0BueHAuY29tPg0KPiA+DQo+ID4gLS0tDQo+ID4gQSBmZXcg cXVlc3Rpb24gbWF5IG5lZWQgZGlzY3VzczoNCj4gPiAxKSAgVGhpcyBwYXRjaCBpcyB3cml0dGVu IGJhc2VkIG9uIG9mX2Nsa19idWxrX2dldC4NCj4gPiBbVjQsMS8xXSBjbGs6IGJ1bGs6IGFkZCBv Zl9jbGtfYnVsa19nZXQoKQ0KPiA+DQo+IGh0dHBzOi8vZW1lYTAxLnNhZmVsaW5rcy5wcm90ZWN0 aW9uLm91dGxvb2suY29tLz91cmw9aHR0cHMlM0ElMkYlMkZwYXQNCj4gPg0KPiBjaHdvcmsua2Vy bmVsLm9yZyUyRnBhdGNoJTJGOTk3MTUyNyUyRiZkYXRhPTAyJTdDMDElN0NhaXNoZW5nLmRvbg0K PiBnJTQwbg0KPiA+DQo+IHhwLmNvbSU3QzQ0OTIwOWRkM2UxOTQ5MWFmYjk5MDhkNThkYjU5NjZk JTdDNjg2ZWExZDNiYzJiNGM2ZmE5MmMNCj4gZDk5YzVjDQo+ID4NCj4gMzAxNjM1JTdDMCU3QzAl N0M2MzY1NzA3MzM0MTE3NTQxMjcmc2RhdGE9NG01ZW1YT1IlMkJ1aTNNcXcNCj4gTWJBSlFEUXhK Y0UNCj4gPiAlMkJ4TGNCNTFoRWkycTNWMk84JTNEJnJlc2VydmVkPTAgU3RlcGVuIG9uY2Ugc2Fp ZCB3ZSBtYXkgbm90DQo+IG5lZWQgaXQsDQo+ID4gYnV0IGkgZ3Vlc3MgYXMgd2UgYWxyZWFkeSBo YXZlIGNsa19idWxrX2dldCwgdGhlcmUgbWF5IGJlIGd1eXMgd2hvDQo+ID4gd2FudCBvZl9jbGtf YnVsa19nZXQgYXMgd2VsbCBpZiB0aGV5IG5lZWQgc3BlY2lmeSB0aGUgY2xvY2sgY291bnQNCj4g PiBpbmZvcm1hdGlvbiwgYmVjYXVlcyBvZl9jbGtfYnVsa19nZXRfYWxsIHdpbGwgbm90IGNoZWNr IHRoZSBjb3VudC4NCj4gPiBBbmQgb2ZfY2xrX2J1bGtfZ2V0IGlzIGFsc28gaGVscGZ1bCB3aGVu IGltcGxlbWVudGluZw0KPiA+IG9mX2Nsa19idWxrX2dldF9hbGwuDQo+IA0KPiBIbW0gb2suIEl0 J3Mgb2sgdG8gaW1wbGVtZW50IGl0IG9uIHRvcCBvZiBvZl9jbGtfYnVsa19nZXQgSSBzdXBwb3Nl LCBidXQNCj4gbWF5YmUgdGhhdCBBUEkgY2FuIGJlIGtlcHQgcHJpdmF0ZSB1bnRpbCBzb21lb25l IGNhbiBwcm92ZSB0aGV5IG5lZWQgaXQNCj4gYmVjYXVzZSB0aGV5IGRvbid0IGhhdmUgYSBzdHJ1 Y3QgZGV2aWNlIHBvaW50ZXIuIENhbiB5b3UgcGljayB0aGF0IHBhdGNoIGZyb20NCj4gdGhlIGxp c3QgYW5kIHJlc2VuZCBpbiB0aGUgc2VyaWVzPw0KPiANCg0KT2YgY291cnNlLiBJIHdpbGwgZG8g dGhhdC4NCg0KPiA+DQo+ID4gMikgSXQgb25seSBpbXBsZW1lbnRzIHRoZSBEVCB0eXBlIGNsa19n ZXRfYWxsIGFzIGkgc2VlIFN0ZXBoZW4gc2FpZCB3ZQ0KPiA+IHByb2JhYmx5IG1heSBub3QgbmVl ZCB0byBpbXBsZW1lbnQgbm9uLWR0IHR5cGUgYXMgdGhlcmUncmUgc3RpbGwgbm8NCj4gPiB1c2Vy cy4NCj4gDQo+IEdvb2QuDQo+IA0KPiA+DQo+ID4gSWYgd2UgZG8gd2FudCB0byBpbXBsZW1lbnQg bm9uLWR0IHR5cGUgYXMgd2VsbCwgd2UgY291bGQgcmV2aXNlIHRoZQ0KPiA+IHBhdGNoIHRvIGFk ZCBpdCB0b28uDQo+ID4gLS0tDQo+ID4gIGRyaXZlcnMvY2xrL2Nsay1idWxrLmMgfCA2NA0KPiAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiA+ICBp bmNsdWRlL2xpbnV4L2Nsay5oICAgIHwgNjENCj4gKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKy0NCj4gPiAgMiBmaWxlcyBjaGFuZ2VkLCAxMjQgaW5zZXJ0aW9u cygrKSwgMSBkZWxldGlvbigtKQ0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Ns ay1idWxrLmMgYi9kcml2ZXJzL2Nsay9jbGstYnVsay5jIGluZGV4DQo+ID4gMWMxYTc5ZC4uYmFj MmFhZSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2Nsay9jbGstYnVsay5jDQo+ID4gKysrIGIv ZHJpdmVycy9jbGsvY2xrLWJ1bGsuYw0KPiA+IEBAIC0xNyw5ICsxNywxMSBAQA0KPiA+ICAgKi8N Cj4gPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvY2xrLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9j bGstcHJvdmlkZXIuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPg0KPiA+ICAjaW5j bHVkZSA8bGludXgvZXhwb3J0Lmg+DQo+ID4gICNpbmNsdWRlIDxsaW51eC9vZi5oPg0KPiA+ICsj aW5jbHVkZSA8bGludXgvc2xhYi5oPg0KPiA+DQo+ID4gICNpZiBkZWZpbmVkKENPTkZJR19PRikg JiYgZGVmaW5lZChDT05GSUdfQ09NTU9OX0NMSykgIGludA0KPiA+IF9fbXVzdF9jaGVjayBvZl9j bGtfYnVsa19nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IG51bV9jbGtzLCBAQA0KPiA+ IC01MCw2ICs1Miw0NSBAQCBpbnQgX19tdXN0X2NoZWNrIG9mX2Nsa19idWxrX2dldChzdHJ1Y3Qg ZGV2aWNlX25vZGUNCj4gKm5wLCBpbnQgbnVtX2Nsa3MsDQo+ID4gICAgICAgICByZXR1cm4gcmV0 Ow0KPiA+ICB9DQo+ID4gIEVYUE9SVF9TWU1CT0wob2ZfY2xrX2J1bGtfZ2V0KTsNCj4gPiArDQo+ ID4gK3N0cnVjdCBjbGtfYnVsayBfX211c3RfY2hlY2sgKm9mX2Nsa19idWxrX2dldF9hbGwoc3Ry dWN0IGRldmljZV9ub2RlDQo+ID4gKypucCkgew0KPiA+ICsgICAgICAgc3RydWN0IGNsa19idWxr ICpjbGtfYnVsazsNCj4gPiArICAgICAgIGludCBudW1fY2xrczsNCj4gPiArICAgICAgIGludCBy ZXQ7DQo+ID4gKw0KPiA+ICsgICAgICAgbnVtX2Nsa3MgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3Vu dChucCk7DQo+ID4gKyAgICAgICBpZiAoIW51bV9jbGtzKQ0KPiA+ICsgICAgICAgICAgICAgICBy ZXR1cm4gTlVMTDsNCj4gPiArDQo+ID4gKyAgICAgICBjbGtfYnVsayA9IGt6YWxsb2Moc2l6ZW9m KCpjbGtfYnVsaykgKw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jbGtzICog c2l6ZW9mKHN0cnVjdCBjbGtfYnVsa19kYXRhKSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICBHRlBfS0VSTkVMKTsNCj4gPiArICAgICAgIGlmICghY2xrX2J1bGspDQo+ID4gKyAgICAg ICAgICAgICAgIHJldHVybiBFUlJfUFRSKC1FTk9NRU0pOw0KPiA+ICsNCj4gPiArICAgICAgIGNs a19idWxrLT5udW1fY2xrcyA9IG51bV9jbGtzOw0KPiA+ICsgICAgICAgcmV0ID0gb2ZfY2xrX2J1 bGtfZ2V0KG5wLCBjbGtfYnVsay0+bnVtX2Nsa3MsIGNsa19idWxrLT5jbGtzKTsNCj4gPiArICAg ICAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICAgICAga2ZyZWUoY2xrX2J1bGspOw0KPiA+ ICsgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUUihyZXQpOw0KPiA+ICsgICAgICAgfQ0KPiAN Cj4gSGFzIHRoaXMgYmVlbiB0ZXN0ZWQ/IGNsa19idWxrLT5jbGtzIHByb2JhYmx5IHBvaW50cyB0 byBqdW5rPw0KPiANCg0KWW91J3JlIHJpZ2h0LiBXaWxsIGZpeCBpbiBhIGZvcm1hbCBwYXRjaC4N Cg0KPiA+ICsNCj4gPiArICAgICAgIHJldHVybiBjbGtfYnVsazsNCj4gPiArfQ0KPiA+ICtFWFBP UlRfU1lNQk9MKG9mX2Nsa19idWxrX2dldF9hbGwpOw0KPiA+ICsNCj4gPiArdm9pZCBvZl9jbGtf YnVsa19wdXRfYWxsKHN0cnVjdCBjbGtfYnVsayAqY2xrX2J1bGspIHsNCj4gPiArICAgICAgIGlm IChJU19FUlJfT1JfTlVMTChjbGtfYnVsaykpDQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybjsN Cj4gPiArDQo+ID4gKyAgICAgICBjbGtfYnVsa19wdXQoY2xrX2J1bGstPm51bV9jbGtzLCBjbGtf YnVsay0+Y2xrcyk7DQo+ID4gKw0KPiA+ICsgICAgICAga2ZyZWUoY2xrX2J1bGstPmNsa3MpOw0K PiA+ICsgICAgICAga2ZyZWUoY2xrX2J1bGspOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0wo b2ZfY2xrX2J1bGtfcHV0X2FsbCk7DQo+ID4gICNlbmRpZg0KPiANCj4gTXkgZ29hbCB3YXMgdG8g bWFrZSBkZXZpY2UgZHJpdmVycyBwYXNzIGluIHRoZWlyIHN0cnVjdCBkZXZpY2UgdG8NCj4gY2xr X2J1bGtfZ2V0X2FsbCgpIGFuZCB0aGVuIGhhdmUgdGhhdCBjYWxsIGludG8gYSBwcml2YXRlIERU IGhlbHBlciBmdW5jdGlvbg0KPiBsaWtlIG9mX2Nsa19idWxrX2dldF9hbGwoKS4gV2l0aCB5b3Vy IHBhdGNoIDIgdGhhdCBjb3VsZCBzdGlsbCBiZSBkb25lIHNvIGxldCdzDQo+IGdvIHRoYXQgZGly ZWN0aW9uPw0KPiANCg0KU291bmRzIGdvb2QgdG8gbWUuDQoNCj4gPg0KPiA+ICB2b2lkIGNsa19i dWxrX3B1dChpbnQgbnVtX2Nsa3MsIHN0cnVjdCBjbGtfYnVsa19kYXRhICpjbGtzKSBAQCAtMTA3 LDYNCj4gPiArMTQ4LDEyIEBAIHZvaWQgY2xrX2J1bGtfdW5wcmVwYXJlKGludCBudW1fY2xrcywg Y29uc3Qgc3RydWN0DQo+ID4gY2xrX2J1bGtfZGF0YSAqY2xrcykgIH0gIEVYUE9SVF9TWU1CT0xf R1BMKGNsa19idWxrX3VucHJlcGFyZSk7DQo+ID4NCj4gPiArdm9pZCBpbmxpbmUgY2xrX2J1bGtf dW5wcmVwYXJlX2FsbChjb25zdCBzdHJ1Y3QgY2xrX2J1bGsgKmNsa19idWxrKSB7DQo+ID4gKyAg ICAgICBjbGtfYnVsa191bnByZXBhcmUoY2xrX2J1bGstPm51bV9jbGtzLCBjbGtfYnVsay0+Y2xr cyk7IH0NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2J1bGtfdW5wcmVwYXJlX2FsbCk7DQo+ IA0KPiBEbyB3ZSByZWFsbHkgbmVlZCB0aGVzZSBfYWxsIEFQSXMgdGhvdWdoPw0KPiANCj4gPiAr DQo+ID4gIC8qKg0KPiA+ICAgKiBjbGtfYnVsa19wcmVwYXJlIC0gcHJlcGFyZSBhIHNldCBvZiBj bG9ja3MNCj4gPiAgICogQG51bV9jbGtzOiB0aGUgbnVtYmVyIG9mIGNsa19idWxrX2RhdGEgQEAg LTEzOSw2ICsxODYsMTEgQEAgaW50DQo+ID4gX19tdXN0X2NoZWNrIGNsa19idWxrX3ByZXBhcmUo aW50IG51bV9jbGtzLCAgfQ0KPiA+IEVYUE9SVF9TWU1CT0xfR1BMKGNsa19idWxrX3ByZXBhcmUp Ow0KPiA+DQo+ID4gK2ludCBpbmxpbmUgX19tdXN0X2NoZWNrIGNsa19idWxrX3ByZXBhcmVfYWxs KGNvbnN0IHN0cnVjdCBjbGtfYnVsaw0KPiA+ICsqY2xrX2J1bGspDQo+IA0KPiBpbmxpbmUgd29u J3QgaGVscCBtdWNoIGhlcmUuIE1heWJlIHRoZXNlIHdyYXBwZXJzIHNob3VsZCBnbyBpbnRvIHRo ZQ0KPiBoZWFkZXIgZmlsZT8NCj4gDQoNCldpbGwgdHJ5IHRoYXQuDQoNCj4gPiArew0KPiA+ICsg ICAgICAgcmV0dXJuIGNsa19idWxrX3ByZXBhcmUoY2xrX2J1bGstPm51bV9jbGtzLCBjbGtfYnVs ay0+Y2xrcyk7IH0NCj4gPiArDQo+ID4gICNlbmRpZiAvKiBDT05GSUdfSEFWRV9DTEtfUFJFUEFS RSAqLw0KPiA+DQo+ID4gIC8qKg0KPiA+IEBAIC0xNTgsNiArMjEwLDEyIEBAIHZvaWQgY2xrX2J1 bGtfZGlzYWJsZShpbnQgbnVtX2Nsa3MsIGNvbnN0IHN0cnVjdA0KPiA+IGNsa19idWxrX2RhdGEg KmNsa3MpICB9ICBFWFBPUlRfU1lNQk9MX0dQTChjbGtfYnVsa19kaXNhYmxlKTsNCj4gPg0KPiA+ ICt2b2lkIGlubGluZSBjbGtfYnVsa19kaXNhYmxlX2FsbChjb25zdCBzdHJ1Y3QgY2xrX2J1bGsg KmNsa19idWxrKQ0KPiANCj4gZGl0dG8NCj4gDQo+ID4gK3sNCj4gPiArICAgICAgIHJldHVybiBj bGtfYnVsa19kaXNhYmxlKGNsa19idWxrLT5udW1fY2xrcywgY2xrX2J1bGstPmNsa3MpOyB9DQo+ ID4gK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19idWxrX2Rpc2FibGVfYWxsKTsNCj4gPiArDQo+ID4g IC8qKg0KPiA+ICAgKiBjbGtfYnVsa19lbmFibGUgLSB1bmdhdGUgYSBzZXQgb2YgY2xvY2tzDQo+ ID4gICAqIEBudW1fY2xrczogdGhlIG51bWJlciBvZiBjbGtfYnVsa19kYXRhIEBAIC0xODgsMyAr MjQ2LDkgQEAgaW50DQo+ID4gX19tdXN0X2NoZWNrIGNsa19idWxrX2VuYWJsZShpbnQgbnVtX2Ns a3MsIGNvbnN0IHN0cnVjdCBjbGtfYnVsa19kYXRhDQo+ICpjbGtzKQ0KPiA+ICAgICAgICAgcmV0 dXJuICByZXQ7DQo+ID4gIH0NCj4gPiAgRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2J1bGtfZW5hYmxl KTsNCj4gPiArDQo+ID4gK2ludCBpbmxpbmUgX19tdXN0X2NoZWNrIGNsa19idWxrX2VuYWJsZV9h bGwoY29uc3Qgc3RydWN0IGNsa19idWxrDQo+ID4gKypjbGtfYnVsaykNCj4gDQo+IGFnYWluDQo+ IA0KPiA+ICt7DQo+ID4gKyAgICAgICByZXR1cm4gY2xrX2J1bGtfZW5hYmxlKGNsa19idWxrLT5u dW1fY2xrcywgY2xrX2J1bGstPmNsa3MpOyB9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19i dWxrX2VuYWJsZV9hbGwpOw0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay5oIGIv aW5jbHVkZS9saW51eC9jbGsuaCBpbmRleA0KPiA+IDA5YWU3NjAuLmNjYWZkYTEgMTAwNjQ0DQo+ ID4gLS0tIGEvaW5jbHVkZS9saW51eC9jbGsuaA0KPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvY2xr LmgNCj4gPiBAQCAtOTIsNiArOTIsMjEgQEAgc3RydWN0IGNsa19idWxrX2RhdGEgew0KPiA+ICAg ICAgICAgc3RydWN0IGNsayAgICAgICAgICAgICAgKmNsazsNCj4gPiAgfTsNCj4gPg0KPiA+ICsv KioNCj4gPiArICogc3RydWN0IGNsa19idWxrIC0gYnVsayBjbGsgc3RydWN0dXJlDQo+ID4gKyAq DQo+ID4gKyAqIEBudW1fY2xrczogdGhlIG51bWJlciBvZiBhdmFsaWFibGUgY2xvY2tzIGluIHRo aXMgYnVsaw0KPiA+ICsgKiBAY2xrczogc3RydWN0IGNsa19idWxrX2RhdGEgKiB0byBzdG9yZSB0 aGUgYXNzb2NpYXRlZCBjbG9jaw0KPiA+ICsgKg0KPiA+ICsgKiBUaGUgQ0xLIEFQSXMgcHJvdmlk ZSBhIHNlcmllcyBvZiBjbGtfYnVsa194X2FsbCgpIEFQSSBjYWxscyBhcw0KPiA+ICsgKiBhIGNv bnZlbmllbmNlIHRvIGNvbnN1bWVycyB3aGljaCByZXF1aXJlIG11bHRpcGxlIGNsa3MuICBUaGlz DQo+ID4gKyAqIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hbmFnZSBkYXRhIGZvciB0aGVzZSBjYWxs cy4NCj4gPiArICovDQo+ID4gK3N0cnVjdCBjbGtfYnVsayB7DQo+ID4gKyAgICAgICBpbnQgbnVt X2Nsa3M7DQo+ID4gKyAgICAgICBzdHJ1Y3QgY2xrX2J1bGtfZGF0YSAqY2xrczsNCj4gPiArfTsN Cj4gDQo+IFRoaXMgY291bGQgZ28gYXdheSwgYW5kIHdlIGNvdWxkIHJldHVybiB0aGUgbnVtYmVy IG9mIGNsa3MgZnJvbQ0KPiBjbGtfYnVsa19nZXRfYWxsKCkgYXMgYSBwb3NpdGl2ZSBudW1iZXIs IDAgaWYgdGhlcmUgYXJlIG5vbmUsIGFuZCBhIG5lZ2F0aXZlDQo+IG51bWJlciBpZiBzb21ldGhp bmcgZmFpbGVkLiBUaGVuIHdlIGRvbid0IG5lZWQgdGhlIF9hbGwgdmFyaWFudHMgb3IgYQ0KPiB3 cmFwcGVyIHN0cnVjdC4gSXQgd291bGQgYmUgbmljZSB0byBhdm9pZCB0aGUgZXh0cmEgdmFyaWFu dHMganVzdCBiZWNhdXNlIHdlDQo+IG5lZWQgdG8gdGVsbCBpdCB0aGUgbnVtYmVyIG9mIGNsa3Mg dG8gaGFuZGxlLg0KDQpUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGlkZWEuDQpJIHdpbGwgdHJ5IGl0 Lg0KDQpUaGFua3MgZm9yIHlvdXIgZ29vZCBzdWdnZXN0aW9ucy4NCg0KUmVnYXJkcw0KRG9uZyBB aXNoZW5nDQo